过滤多索引
Filtering a mutli-index
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。
所以在上面的 table 中 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 ) & (df.C2 >= 10)] 但这没有用。
我也试过:
过滤器 1 = df.index.get_level_values('C2') < 10
过滤器 2 = df.index.get_level_values('C2') >= 10
df.iloc[过滤器 1 & 过滤器 2]
我在另一个 post 上看到的建议也没有用。任何人都知道如何解决这个问题?谢谢
使用 GroupBy.transform
with GroupBy.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
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。
所以在上面的 table 中 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 ) & (df.C2 >= 10)] 但这没有用。
我也试过:
过滤器 1 = df.index.get_level_values('C2') < 10 过滤器 2 = df.index.get_level_values('C2') >= 10
df.iloc[过滤器 1 & 过滤器 2]
我在另一个 post 上看到的建议也没有用。任何人都知道如何解决这个问题?谢谢
使用 GroupBy.transform
with GroupBy.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