cho*_*raf 17 python multi-index dataframe pandas
我有一个包含3个MultiIndex级别的pandas数据帧.我试图根据对应于两个级别的值列表拉出此数据帧的行.
我有这样的事情:
ix = pd.MultiIndex.from_product([[1, 2, 3], ['foo', 'bar'], ['baz', 'can']], names=['a', 'b', 'c'])
data = np.arange(len(ix))
df = pd.DataFrame(data, index=ix, columns=['hi'])
print(df)
hi
a b c
1 foo baz 0
can 1
bar baz 2
can 3
2 foo baz 4
can 5
bar baz 6
can 7
3 foo baz 8
can 9
bar baz 10
can 11
Run Code Online (Sandbox Code Playgroud)
现在我想要获取索引级别'b'和'c'在此索引中的所有行:
ix_use = pd.MultiIndex.from_tuples([('foo', 'can'), ('bar', 'baz')], names=['b', 'c'])
Run Code Online (Sandbox Code Playgroud)
即值hi具有('foo', 'can')或('bar', 'baz')在水平b和c分别为:(1, 2, 5, 6, 9, 10).
所以我想slice(None)在第一级采取一个,并在第二和第三级提取特定的元组.
最初我认为将多索引对象传递给.loc会拉出我想要的值/级别,但这不起作用.做这样的事情最好的方法是什么?
Pri*_*mer 20
以下是获取此切片的方法:
df.sort_index(inplace=True)
idx = pd.IndexSlice
df.loc[idx[:, ('foo','bar'), 'can'], :]
Run Code Online (Sandbox Code Playgroud)
生产
hi
a b c
1 bar can 3
foo can 1
2 bar can 7
foo can 5
3 bar can 11
foo can 9
Run Code Online (Sandbox Code Playgroud)
请注意,您可能需要先对MultiIndex进行排序,然后才能对其进行切片.如果你需要这么做,熊猫就足够警告了:
KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (3), lexsort depth (1)'
Run Code Online (Sandbox Code Playgroud)
您可以在文档中阅读有关如何使用切片器的更多信息
如果出于某种原因使用切片器不是一个选项,这里是一种使用.isin()方法获得相同切片的方法:
df[df.index.get_level_values('b').isin(ix_use.get_level_values(0)) & df.index.get_level_values('c').isin(ix_use.get_level_values(1))]
Run Code Online (Sandbox Code Playgroud)
这显然不那么简洁.
更新:
对于您在此处更新的条件是一种方法:
cond1 = (df.index.get_level_values('b').isin(['foo'])) & (df.index.get_level_values('c').isin(['can']))
cond2 = (df.index.get_level_values('b').isin(['bar'])) & (df.index.get_level_values('c').isin(['baz']))
df[cond1 | cond2]
Run Code Online (Sandbox Code Playgroud)
生产:
hi
a b c
1 foo can 1
bar baz 2
2 foo can 5
bar baz 6
3 foo can 9
bar baz 10
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9032 次 |
| 最近记录: |