DataFrame中列的子集上的逻辑OR

Pet*_*uke 5 python pandas

我想得到所有行(至少)df [mylist]中的一列包含True.

我现在正在做:

df = df[ df[mylist[0]] | df[mylist[1]] | df[mylist[2]] ]
Run Code Online (Sandbox Code Playgroud)

where mylist列是与列相关的字符串df.但我想这样做的任何长度mylist.

我能想到的唯一方法是循环 mylist并为其中的每个元素创建一个新的数据帧,然后合并/连接或其他任何内容.但这对我来说并不是很聪明.

有没有更好的办法?

unu*_*tbu 4

根据 LondonRob 的答案,您可以使用

\n\n
df.loc[df[mylist].any(axis=1)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

调用 DataFrame 的方法比每行调用一次Python 的内置函数any性能更好。applyany

\n\n

或者你可以使用np.logical_or.reduce

\n\n
df.loc[np.logical_or.reduce(df[mylist], axis=1)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于大型 DataFrame,使用np.logical_or可能会更快:

\n\n
In [30]: df = pd.DataFrame(np.random.binomial(1, 0.1, size=(100,300)).astype(bool))\n\nIn [31]: %timeit df.loc[np.logical_or.reduce(df, axis=1)]\n1000 loops, best of 3: 261 \xc2\xb5s per loop\n\nIn [32]: %timeit df.loc[df.any(axis=1)]\n1000 loops, best of 3: 636 \xc2\xb5s per loop\n\nIn [33]: %timeit df[df.apply(any, axis=1)]\n100 loops, best of 3: 2.13 ms per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,它df.any具有额外的功能,例如跳过 NaN 的能力。\n在这种情况下,如果列是布尔值,则不能有任何 NaN\n(因为 NaN 是浮点值)。所以np.logical_or.reduce速度更快。

\n\n
\n\n
import numpy as np\nimport pandas as pd\nnp.random.seed(2014)\ndf = pd.DataFrame(np.random.binomial(1, 0.1, size=(10,3)).astype(bool), \n                  columns=list(\'ABC\'))\nprint(df)\n#        A      B      C\n# 0  False  False  False\n# 1   True  False  False\n# 2  False  False  False\n# 3   True  False  False\n# 4  False  False  False\n# 5  False  False  False\n# 6  False   True  False\n# 7  False  False  False\n# 8  False  False  False\n# 9  False  False  False\n\nmylist = list(\'ABC\')\nprint(df[ df[mylist[0]] | df[mylist[1]] | df[mylist[2]] ])\nprint(df.loc[df[mylist].any(axis=1)])\nprint(df.loc[np.logical_or.reduce(df[mylist], axis=1)])\n
Run Code Online (Sandbox Code Playgroud)\n\n

产生至少一列为 True 的行:

\n\n
       A      B      C\n1   True  False  False\n3   True  False  False\n6  False   True  False\n
Run Code Online (Sandbox Code Playgroud)\n