我有一个包含我数据的大型数据框,以及包含每个时间点元数据的相同第一维的另一个数据框(例如,它是什么试用版,它是什么样的试用版)。
我想要做的是使用“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']])
答案 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']))
之前:
tempDf1 = tempDf.set_index(['Country', 'Region','Happiness_Rank','Happiness_Score','Economy_(GDP_per_Capita)'])
tempDf1