基于 LondonRob 的回答,您可以使用
df.loc[df[mylist].any(axis=1)]
调用 DataFrame 的 any 方法将比使用 apply 每行调用一次 Python 的内置 any 函数执行得更好。
或者你可以使用np.logical_or.reduce:
df.loc[np.logical_or.reduce(df[mylist], axis=1)]
对于大型 DataFrame,使用np.logical_or 可能更快:
In [30]: df = pd.DataFrame(np.random.binomial(1, 0.1, size=(100,300)).astype(bool))
In [31]: %timeit df.loc[np.logical_or.reduce(df, axis=1)]
1000 loops, best of 3: 261 µs per loop
In [32]: %timeit df.loc[df.any(axis=1)]
1000 loops, best of 3: 636 µs per loop
In [33]: %timeit df[df.apply(any, axis=1)]
100 loops, best of 3: 2.13 ms per loop
请注意,df.any 具有额外的功能,例如跳过 NaN 的能力。
在这种情况下,如果列是布尔值,则不能有任何 NaN
(因为 NaN 是浮点值)。所以np.logical_or.reduce 更快。
import numpy as np
import pandas as pd
np.random.seed(2014)
df = pd.DataFrame(np.random.binomial(1, 0.1, size=(10,3)).astype(bool),
columns=list('ABC'))
print(df)
# A B C
# 0 False False False
# 1 True False False
# 2 False False False
# 3 True False False
# 4 False False False
# 5 False False False
# 6 False True False
# 7 False False False
# 8 False False False
# 9 False False False
mylist = list('ABC')
print(df[ df[mylist[0]] | df[mylist[1]] | df[mylist[2]] ])
print(df.loc[df[mylist].any(axis=1)])
print(df.loc[np.logical_or.reduce(df[mylist], axis=1)])
产生至少一列为真的行:
A B C
1 True False False
3 True False False
6 False True False