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

cho*_*raf 8 python numpy scipy pandas scikit-learn

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

我想要做的是使用"metadataframe"的值来切割大型数据帧.我想保持这些独立(而不是将元数据帧存储为较大元数据的多索引).

现在,我正在尝试做这样的事情:

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

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

ValueError: Must pass DataFrame with boolean values only
Run Code Online (Sandbox Code Playgroud)

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

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

我的解决方案

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

dfa.set_index(dfb[['col1', 'col2']]) 
Run Code Online (Sandbox Code Playgroud)

不起作用,但是

dfa.set_index([dfb.col1, dfb.col2])
Run Code Online (Sandbox Code Playgroud)

确实.

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

dfa.set_index([dfb[col] for col in ['col1', 'col2']])
Run Code Online (Sandbox Code Playgroud)

HYR*_*YRY 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
Run Code Online (Sandbox Code Playgroud)

结果:

       C
1 a  100
2 b  200
3 c  300
Run Code Online (Sandbox Code Playgroud)