Pandas:使用数据框的多个列作为另一个的索引

时间:2014-02-18 06:43:08

标签: python numpy pandas scipy scikit-learn

我有一个包含我数据的大型数据框,以及包含每个时间点元数据的相同第一维的另一个数据框(例如,它是什么试用版,它是什么样的试用版)。

我想要做的是使用“metadataframe”的值对大型数据帧进行切片。我想保持这些独立(而不是将元数据帧存储为较大元数据的多索引)。

现在,我正在尝试这样做:

def my_func(container):
   container.big_df.set_index(container.meta_df[['col1', 'col2']])
   container.big_df.loc['col1val', 'col2val'].plot()

但是,这会返回以下错误:

ValueError: Must pass DataFrame with boolean values only

请注意,如果我只将一个列传递给set_index,这样可以正常工作。

有谁能弄明白这里出了什么问题?或者,有人可以告诉我,我是以一种完全愚蠢和愚蠢的方式做到这一点,并且有一个更好的方法去做吗? :)

我的解决方案

感谢您的想法。我玩了索引一点点,这似乎是最简单/最快的。我不喜欢剥离其名称的索引,并且转换值等似乎很麻烦。我意识到一些有趣的东西(可能很容易修复):

dfa.set_index(dfb[['col1', 'col2']]) 

不起作用,但

dfa.set_index([dfb.col1, dfb.col2])

确实

因此,您基本上可以将dfb转换为列列表,使set_index工作,遵循以下约定:

dfa.set_index([dfb[col] for col in ['col1', 'col2']])

3 个答案:

答案 0 :(得分:7)

使用MultiIndex.from_arrays()创建索引对象:

import pandas as pd
df1 = pd.DataFrame({"A":[1,2,3], "B":["a","b","c"]})
df2 = pd.DataFrame({"C":[100,200,300]})
df2.index = pd.MultiIndex.from_arrays(df1.values.T)

print df2

结果:

       C
1 a  100
2 b  200
3 c  300

答案 1 :(得分:1)

将您的第一行更改为:

container.big_df.index=pd.MultiIndex.from_arrays(container.meta_df[['col1', 'col2']].values.T, names=['i1','i2'])

答案 2 :(得分:0)

我参考了这个实现:link

import pandas as pd
 
employees = pd.DataFrame({
    'EmpCode': ['Emp001', 'Emp002', 'Emp003', 'Emp004', 'Emp005'],
    'Name': ['John', 'Doe', 'William', 'Spark', 'Mark'],
    'Occupation': ['Chemist', 'Statistician', 'Statistician',
                   'Statistician', 'Programmer'],
    'Date Of Join': ['2018-01-25', '2018-01-26', '2018-01-26', '2018-02-26',
                     '2018-03-16'],
    'Age': [23, 24, 34, 29, 40]})
 
print("\n --------- Before Index ----------- \n")
print(employees)
 
print("\n --------- Multiple Indexing ----------- \n")
print(employees.set_index(['Occupation', 'Age']))

之前:

enter image description here

tempDf1 = tempDf.set_index(['Country', 'Region','Happiness_Rank','Happiness_Score','Economy_(GDP_per_Capita)'])
tempDf1

之后: enter image description here