【问题标题】:Filtering a mutli-index过滤多索引
【发布时间】:2022-01-17 16:26:30
【问题描述】:
C1 C2 C3 C4
A 12 True 89
9 False 77
5 True 23
B 9 True 45
5 True 45
2 False 78
C 11 True 10
8 False 08
12 False 09

C1 & C2 是多索引。我希望得到一个结果,它只给我 C1 中的值,这些值在 C2 中的值既低于 10 又大于或等于 10。

所以上表中C1-B应该去,最终结果应该是这样的:

C1 C2 C3 C4
A 12 True 89
9 False 77
5 True 23
C 11 True 10
8 False 08
12 False 09

我试过 df.loc[(df.C2 = 10)] 但这没有用。

我也试过了:

filter1 = df.index.get_level_values('C2') = 10

df.iloc[filter1 & filter2]

我在另一篇同样无效的帖子中看到了建议。有谁知道如何解决这个问题?谢谢

【问题讨论】:

  • 请提供您的数据框作为字典:df.to_dict()。更容易复制 MultiIndex
  • (df.C2 < 10 ) & (df.C2 >= 10) 正确吗?因为它意味着所有的价值
  • @jazrael 这就是我想要的。值高于和低于的那些。不是刚好低于或高于。

标签: python pandas multi-index


【解决方案1】:

使用GroupBy.transformGroupBy.any 测试每个组至少一个条件匹配,因此可能最后通过m DataFrame 过滤:

filter1 = df.index.get_level_values('C2') < 10 
filter2 = df.index.get_level_values('C2') >= 10

m = (df.assign(filter1= filter1, filter2=filter2)
       .groupby(level=0)[['filter1','filter2']]
       .transform('any'))

print (m)
       filter1  filter2
C1 C2                  
A  12     True     True
   9      True     True
   5      True     True
B  9      True    False
   5      True    False
   2      True    False
C  11     True     True
   8      True     True
   12     True     True

df = df[m.filter1 & m.filter2]
print (df)
          C3  C4
C1 C2           
A  12   True  89
   9   False  77
   5    True  23
C  11   True  10
   8   False   8
   12  False   9

替代解决方案:

filter1 = df.index.get_level_values('C2') < 10 
filter2 = df.index.get_level_values('C2') >= 10

lvl1 = df.index[filter1].remove_unused_levels().levels[0]
lvl2 = df.index[filter2].remove_unused_levels().levels[0]

df1 = df.loc[set(lvl1).intersection(lvl2)]
print (df1)
          C3  C4
C1 C2           
A  12   True  89
   9   False  77
   5    True  23
C  11   True  10
   8   False   8
   12  False   9

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 2020-08-08
    • 1970-01-01
    • 2021-12-10
    • 2023-04-08
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多