首页 > 解决方案 > Python groupby 单行 if else 语句

问题描述

我想将单行 if else 语句应用于我的数据框中的组,但不确定如何映射它。

我的数据如下所示:

    user                in               out location  overlap    Time    overlap_new
0    ron  12/21/2021 10:11  12/21/2016 17:50     home     0  4:19:03      'complete'
1    ron  12/21/2016 13:26  12/21/2016 13:52   office     2  0:25:28      'complete'
2  april   12/21/2016 8:12  12/21/2016 17:27   office     0  8:15:03      'none'
3  april  12/21/2016 18:54  12/21/2016 22:56   office     0  4:02:36      'none'
4   andy   12/21/2016 8:57  12/21/2016 12:15     home     0  2:59:40      'partial'
5   andy   12/21/2016 8:57  12/21/2016 12:15     home     1  2:59:40      'partial'

我希望重叠是一个单一的值,如重叠新中所示,基于重叠中的值。

这是我的代码:

s = sample.groupby('user')['overlap']
sample.loc[:,'overlap_new'] = s.apply(['partial' if ele == 1 else 'complete' if ele ==2 else 'none' for ele in sample['overlap']])

如何将 groupby 应用于单个 if else 行?

标签: pythonpandasif-statementgroup-bypandas-groupby

解决方案


GroupBy.transform与测试值一起使用,Series.any每组至少匹配一个值:

f = lambda x: 'partial' if (x == 1).any() else 'complete' if (x == 2).any() else 'none'
sample['overlap_new'] = sample.groupby('user')['overlap'].transform(f)
print (sample)
    user                in               out location  overlap     Time  \
0    ron  12/21/2021 10:11  12/21/2016 17:50     home        0  4:19:03   
1    ron  12/21/2016 13:26  12/21/2016 13:52   office        2  0:25:28   
2  april   12/21/2016 8:12  12/21/2016 17:27   office        0  8:15:03   
3  april  12/21/2016 18:54  12/21/2016 22:56   office        0  4:02:36   
4   andy   12/21/2016 8:57  12/21/2016 12:15     home        0  2:59:40   
5   andy   12/21/2016 8:57  12/21/2016 12:15     home        1  2:59:40   

  overlap_new  
0    complete  
1    complete  
2        none  
3        none  
4     partial  
5     partial  

推荐阅读