Filter pandas dataframe with various number of conditions

e4eetjau  于 2023-05-21  发布在  其他
关注(0)|答案(3)|浏览(105)

我有一个列的列表,作为pandas df中的过滤条件,但该列表具有不同数量的列,我想用一种方法来自动过滤所有列,而不必单独指定它们。
代码如下所示:

filters = ['col_43', 'col_44', 'col_45', ...]

filtered_df = df[(df[filters[0]]=='Y') | (df[filters[1]]=='Y') | (df[filters[2]]=='Y')...]

有时列表可以包含10个过滤器,其他时候更多。自动化可能吗?
我用的是Pandas1.0.3

ogsagwnx

ogsagwnx1#

由于所有列都有相同的条件,因此使用any和布尔索引:

filtered_df = df[df[filters].eq('Y').any(axis=1)]

如果你想使用不同的条件,你需要一个字典:

filters = {'col_43': 'Y', 'col_44': 'N'}

filtered_df = df[df[list(filters)].eq(filters).all(axis=1)]
ccrfmcuu

ccrfmcuu2#

您可以使用pd.DataFrameequality method并将过滤器应用于filters列表中的所有列:

filtered_df = df[df[filters].eq('Y').any(axis=1)]

mozway更快:D

w3nuxt5m

w3nuxt5m3#

是的,可以使用Python中的**any()**函数和列表解析来实现自动化。可以修改代码,以便根据筛选器列表中不同的列数动态应用筛选条件。下面是一个例子:

filters = ['col_43', 'col_44', 'col_45', ...]
filtered_df = df[(df[filters].eq('Y')).any(axis=1)]

**df[filters].eq('Y ')创建一个布尔DataFrame,其中filters中指定的每一列都与值' Y '**进行比较。结果是一个DataFrame,在满足条件的情况下为True值,否则为False值。

然后,通过对该DataFrame应用any(axis=1)方法,它检查是否有任何列的每一行都具有True值。这将返回一个布尔Series,指示每行是否满足任何条件。

相关问题