【问题标题】:How to make a conditional column using groupby?如何使用 groupby 制作条件列?
【发布时间】:2019-12-15 02:34:10
【问题描述】:

我有一个看起来像这样的数据框。

Group   Task    Status   
1       A       Success
1       B       Success
1       C       Success
2       A       Success
2       B       Success
2       C       Failed

我想创建一个按组对数据框进行分组的条件逻辑。如果组的 ALL 状态为 Success,则Overall_Status 为Success。如果该组的 ANY 状态为 Failed,则Overall_Status 为Failed

Group   Task    Status         Overall_Status
1       A       Success        Success
1       B       Success        Success
1       C       Success        Success
2       A       Success        Failed
2       B       Success        Failed
2       C       Failed         Failed

【问题讨论】:

    标签: python pandas group-by conditional-statements


    【解决方案1】:

    使用GroupBy.transformGroupBy.all 测试是否所有值都是Success 每组使用Series.eq 并通过numpy.where 设置值:

    mask = df['Status'].eq('Success').groupby(df['Group']).transform('all')
    df['Overall_Status'] = np.where(mask, 'Success','Failed')
    print (df)
       Group Task   Status Overall_Status
    0      1    A  Success        Success
    1      1    B  Success        Success
    2      1    C  Success        Success
    3      2    A  Success         Failed
    4      2    B  Success         Failed
    5      2    C   Failed         Failed
    

    或使用Series.ne 获取不等于Success 的组并通过Series.isin 创建掩码:

    mask1 = df['Group'].isin(df.loc[df['Status'].ne('Success'), 'Group'].unique())
    

    另一个想法是使用GroupBy.any 每组至少测试一个Failed

    mask1 = df['Status'].eq('Failed').groupby(df['Group']).transform('any')
    df['Overall_Status'] = np.where(mask1, 'Failed', 'Success')
    
    print (df)
       Group Task   Status Overall_Status
    0      1    A  Success        Success
    1      1    B  Success        Success
    2      1    C  Success        Success
    3      2    A  Success         Failed
    4      2    B  Success         Failed
    5      2    C   Failed         Failed
    

    【讨论】:

    • 当我尝试这个时它说一切都是Failed
    • @Josh - print(df['Status'].tolist()) 是什么?
    • @Josh - 因为值 Success 似乎有一些空格或类似问题
    • ['成功','成功','成功','成功','成功','成功','成功','成功','成功','成功','成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功' , '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功', '成功”、“成功”、“成功”、“成功”、“成功”、“成功”、“成功”、“成功”、“成功”、“失败”]
    • 请注意,我是在更大/真实的数据上做这个,但原理是一样的。
    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2020-04-26
    • 2018-08-27
    • 2017-10-02
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多