熊猫:使用数据框的多列作为另一个的索引
Posted
技术标签:
【中文标题】熊猫:使用数据框的多列作为另一个的索引【英文标题】:Pandas: Use multiple columns of a dataframe as index of another 【发布时间】:2014-03-17 18:10:39 【问题描述】:我有一个包含我的数据的大型数据框,以及另一个相同第一维度的数据框,其中包含有关每个时间点的元数据(例如,它是什么试验编号,它是什么试验类型)。
我想要做的是使用“元数据帧”的值对大数据帧进行切片。我想将它们分开(而不是将元数据帧存储为较大的多索引)。
现在,我正在尝试做这样的事情:
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']])
【问题讨论】:
【参考方案1】:使用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
【讨论】:
【参考方案2】:将您的第一行更改为:
container.big_df.index=pd.MultiIndex.from_arrays(container.meta_df[['col1', 'col2']].values.T, names=['i1','i2'])
【讨论】:
【参考方案3】:我参考this :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
之后:
【讨论】:
以上是关于熊猫:使用数据框的多列作为另一个的索引的主要内容,如果未能解决你的问题,请参考以下文章