我有一个这样的DataFrame:
C1 C2 C3 C4
1 A B C E
2 C D E F
3 A C A B
4 A A B G
5 B nan C E
还有一个列表:
filt = [A, B, C]
我需要的是一个过滤器,它只保留具有所有filt
值的行,按任何顺序或位置。所以这里的输出是:
C1 C2 C3 C4
1 A B C E
3 A C A B
我已经看过以前的问题,比如检查多列中的多个值并返回数据帧。然而,在这种情况下,OP只是部分匹配。在我的情况下,所有值都必须以任何顺序存在,才能匹配行。
一个解决方案
用途:
fs_filt = frozenset(filt)
mask = df.apply(frozenset, axis=1) >= fs_filt
res = df[mask]
print(res)
输出
C1 C2 C3 C4
0 A B C E
2 A C A B
其思想是将每一行转换为fronzenset
,然后验证filt
的前集是否是该行元素的子集(>=
(。