首页 > 解决方案 > Pandas - 根据多个条件过滤数据框

问题描述

我有一个数据框df:

type    rec_1   rec_2   rec_3   rec_4   rec_1_outlier   rec_2_outlier   rec_3_outlier   rec_4_outlier
yellow  1          7       3       1       FALSE        TRUE                  TRUE          TRUE
red     3         11       2       5       FALSE        TRUE                 FALSE          FALSE
blue    5         2        1       6        TRUE        FALSE                FALSE          FALSE
green   2         9       13       9        FALSE       FALSE                TRUE           FALSE

我想为每种类型获取单独的数据帧,其中 _outlier 列仅为假,但 rec 列彼此独立,一列可能为真,另一列为假。

所以理论上如果我要尝试

df_blue = df['type']=='blue' & df['rec_1_outlier']=='False' & df['rec_2_outlier']=='False' & df['rec_3_outlier']=='False' & df['rec_4_outlier']=='False'

这可能永远不会选择任何行,因为 _outlier 列可能永远不会全部为假。

我也想过像这样一次写一篇专栏。

df_blue_rec_1 = df['type']=='blue' & df['rec_1_outlier']=='False'
df_blue_rec_2 = df['type']=='blue' & df['rec_2_outlier']=='False'

然后只需将单独的数据框附加到一个中。

我有这种感觉,好像有更好的方法来实现这一点。

标签: pythonpandas

解决方案


你走在正确的道路上。你所做的是创建一个布尔掩码。像这样:

mask_blue =((df['type']=='blue') & 
            (df['rec_1_outlier']=='False') & 
            (df['rec_2_outlier']=='False') & 
            (df['rec_3_outlier']=='False') & 
            (df['rec_4_outlier']=='False') 

此掩码提供与原始 df 的索引相对应的真/假列表。

df_blue = df.loc[mask_blue,:]

现在,您可以通过更改上面的 (:) 来选择要传输到 df_blue 的列。例如:

df_blue = df.loc[mask_blue,['type','rec_1']]

这将给出一个带有列的df:typerec_1

更新
要为每个单独的 rec_1 执行此操作,请尝试为每个 rec_x 创建掩码。这将为真正的异常值提供 nan 值。以下代码是rec_1 和rec_2 的示例。

df_blue = pd.Datafram()
mask_blue1 =((df['type']=='blue') & (df['rec_1_outlier']=='False'))
df_blue.loc[:,'rec_1'] = df.loc[mask_blue1,'rec_1']
mask_blue2 =((df['type']=='blue') & (df['rec_2_outlier']=='False'))
df_blue.loc[:,'rec_2'] = df.loc[mask_blue2,'rec_2']

推荐阅读