【发布时间】:2018-03-19 07:33:18
【问题描述】:
我有一个这样的多索引数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({'ind1': list('aaaaaaaaabbbbbbbbb'),
'ind2': list('cccdddeeecccdddeee'),
'ind3': list(range(3))*6,
'val1': list(range(100, 118)),
'val2': list(range(70, 88))})
df_mult = df.set_index(['ind1', 'ind2', 'ind3'])
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
e 0 106 76
1 107 77
2 108 78
b c 0 109 79
1 110 80
2 111 81
d 0 112 82
1 113 83
2 114 84
e 0 115 85
1 116 86
2 117 87
我现在可以像这样使用.loc 选择它的一个子集
df_subs = df_mult.loc['a', ['c', 'd'], :]
这给出了预期
val1 val2
ind1 ind2 ind3
a c 0 100 70
1 101 71
2 102 72
d 0 103 73
1 104 74
2 105 75
如果我现在想再次选择df_subs 的子集,例如
df_subs.loc['a', 'c', :]
工作并给予
val1 val2
ind3
0 100 70
1 101 71
2 102 72
然而
df_subs.loc[:, 'c', :]
失败并给出错误
KeyError: '标签 [c] 不在 [列]'
为什么会失败?
编辑
最初,我在这篇文章中有两个问题。我一分为二,第二个问题可以找到here。
【问题讨论】:
-
pandas.pydata.org/pandas-docs/stable/advanced.html 为什么不使用
slice或IndexSlice -
@Wen:当然,可能有更好的选择,但我仍然想了解上述尝试失败的原因。如果尝试完全错误,那么很高兴看到正确的做法,即工作替代方案。
-
@JohnE:好的,很高兴知道。我仍然需要弄清楚我什么时候必须使用
IndexSlice。但似乎对于问题 1 并没有任何改变:df_mult.loc[pd.IndexSlice['a', ['c', 'd'], :], :].index仍然在级别 0 中显示a和b;知道为什么吗? -
@JohnE:如果我想将索引的元素用于其他用途,这可能会成为一个问题。然后
df_subs.index.levels[0]给了我Index([u'a', u'b'], dtype='object', name=u'ind1'),但是df_subs.index.get_level_values('ind1').unique()给了我Index([u'a'], dtype='object', name=u'ind1'),这在我看来是不一致的。 -
是的,公平点!尽管我在 99.9% 的时间里都不确定实际的重要性
标签: python pandas select dataframe multi-index