我想从列n
中获取值,其中其他列子集中的值为True。例如,数据帧:
t, f = True, False
data = [
[t, f, f, '1'],
[f, f, f, '2'],
[f, t, f, '3'],
[f, f, t, '4']
]
df = pd.DataFrame(data, columns=list("abcn"))
a b c n
0 True False False 1
1 False False False 2
2 False True False 3
3 False False True 4
搜索列是a
和b
,我希望从n
中获得记录,其中这些列是True
,我尝试过:
fcols = ("a", "b")
df[df[[*fcols]] == t].dropna(axis=0, how='all')
这是给我正确的记录,但是Nan
在n
列
a b c n
0 True NaN NaN NaN
2 NaN True NaN NaN
我觉得我或多或少接近解决办法了,但是……
使用any
聚合布尔值用于布尔索引:
fcols = ("a", "b")
out = df[df[[*fcols]].eq(t).any(axis=1)]#.dropna(axis=0, how='all') # dropna not needed
输出:
a b c n
0 True False False 1
2 False True False 3
中间索引系列:
df[[*fcols]].eq(t).any(axis=1)
0 True
1 False
2 True
3 False
dtype: bool
使用DataFrame.any
测试传递给boolean indexing
的布尔系列的每行至少一个True
匹配:
fcols = ("a", "b")
df = df[df[[*fcols]].eq(t).any(axis=1)]
#if need test Trues, possible remove compare by True
df = df[df[[*fcols]].any(axis=1)]
print (df)
a b c n
0 True False False 1
2 False True False 3
:
print (df[[*fcols]].eq(t).any(axis=1))
0 True
1 False
2 True
3 False
dtype: bool
我决定这样做
df = df[df['a'] | df['b']]
In [5]: df
Out[5]:
a b c n
0 True False False 1
2 False True False 3