【发布时间】:2022-04-02 04:48:28
【问题描述】:
这里有很多标题相似的问题,但我找不到解决这个问题的问题。
我有来自许多不同来源的数据框,我想一个一个地过滤。当布尔系列与过滤后的数据帧大小相同时,使用布尔索引非常有效,但当系列的大小与过滤后的数据帧的更高级别的索引相同时则不行。
简而言之,假设我有这个数据框:
In [4]: df = pd.DataFrame({'a':[1,1,1,2,2,2,3,3,3],
'b':[1,2,3,1,2,3,1,2,3],
'c':range(9)}).set_index(['a', 'b'])
Out[4]:
c
a b
1 1 0
2 1
3 2
2 1 3
2 4
3 5
3 1 6
2 7
3 8
还有这个系列:
In [5]: filt = pd.Series({1:True, 2:False, 3:True})
Out[6]:
1 True
2 False
3 True
dtype: bool
我想要的输出是这样的:
c
a b
1 1 0
2 1
3 2
3 1 6
2 7
3 8
我不是在寻找不使用filt系列的解决方案,例如:
df[df.index.get_level_values('a') != 2]
df[df.index.get_level_values('a').isin([1,3])]
我想知道我是否可以按原样使用我的输入 filt 系列,因为我会在 c: 上使用过滤器
filt = df.c < 7
df[filt]
【问题讨论】:
-
df[df.index.get_level_values('a').isin(filt)]怎么样?我不认为你可以按照你建议的方式做你想做的事,因为你的系列与 MultiIndex 的一个级别“大小不同”。正常显示仅显示该级别的三个值,但 MultiIndex 的每个级别实际上与整个 DataFrame 的长度相同。 -
@BrenBarn 如果有的话,它必须是
df[df.index.get_level_values('a').isin(filt[filt].index)]。我想“不,那是不可能的”是一个公平的答案。