【问题标题】:Pandas - Filter Dataframe on Multiple CriteriaPandas - 根据多个条件过滤数据框
【发布时间】:2020-08-29 20:12:53
【问题描述】:

我有一个数据框 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 列彼此独立,一列可能为真,另一列为假。

所以理论上如果我要尝试

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'

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

我觉得有更好的方法来实现这一点。

【问题讨论】:

    标签: python pandas


    【解决方案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 索引的真/假列表。

    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']
    

    【讨论】:

    • 感谢 Kosmos。问你一个问题,你上面的掩码会只找到所有 _outlier 列 = False 的行吗?有时该行会有 rec_1_outlier == False 但 rec_2_outlier == True。在该行中,我想取 rec_1_outlier 的值,但拒绝 rec_2_outlier。这有意义吗?
    • 没问题。希望对你有效。我已经更新了帖子以匹配您的问题。当掩码给出 False 时,此解决方案将给出 nan 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多