python - 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 行?
解决方案
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