熊猫-根据多个条件过滤数据框

时间:2020-05-13 14:59:24

标签: python 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列仅为false,但是rec列彼此独立,一个列可能为true,而另一列可能为false。

从理论上讲,如果我要尝试

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'

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

我有一种更好的方法来实现这一目标。

1 个答案:

答案 0 :(得分:1)

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

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索引相对应的true / false列表。

df_blue = df.loc[mask_blue,:]

现在,通过更改上面的(:),选择要转移到df_blue的列。例如:

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

这将为以下列提供一个df:typerec_1

更新
为此,请为每个rec_1尝试为每个rec_x创建掩码。这将给出True异常值的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']