pandas使用groupby+apply调用cumsum时输出结果不符合预期如何解决?
问题原因分析
- 你现有的代码执行后返回的是单独的分组计算结果表,包含
country、原行索引列level_1、计算得到的分组序号列三个字段,没有和原始DataFrame进行关联,自然和你想要的「给原表追加连续分组序号列」的预期不符。 - pandas 0.25.3版本中
groupby.apply返回的序列默认保留原始行索引,你不需要额外执行reset_index,直接赋值给原DataFrame的新列即可自动按索引对齐。
正确实现代码
方案1:直接赋值新增列(最简洁)
import pandas as pd # 你的原始数据 data = {'process': ['buying','selling','searhicng','repairing', 'preparing', 'selling','buying', 'searching', 'selling','searching'], 'type': ['in_progress','in_progress','end','in_progress', 'end', 'in_progress','in_progress', 'end', 'in_progress','end'], 'country': ['usa','usa', 'usa','ghana', 'ghana','ghana','ghana', 'ghana', 'albania','albania'], 'id': ['022','022','022', '011','011', '011','011', '011', '6','6'], 'created': ['2021-07-01','2021-07-02','2021-07-03','2021-07-04','2021-07-05','2021-07-06','2021-07-07','2021-07-08','2021-07-09','2021-07-10'] } df = pd.DataFrame(data, columns = ['process','type','country', 'id','created']) # 新增连续分组序号列 df['group_num'] = df.groupby('country')['type'].apply(lambda x: (x != x.shift()).cumsum())
方案2:单独计算结果后合并
如果你需要单独先生成分组结果表再和原表合并,可以修改原有代码如下:
# 生成分组结果 group_result = df.groupby('country').apply(lambda x:(x['type']!=x['type'].shift()).cumsum()).reset_index(name='group_num') # 按索引合并到原表 df = df.merge(group_result, left_index=True, right_on='level_1').drop('level_1', axis=1)
输出结果验证
以country=ghana的分组为例,得到的group_num序列为[1,2,3,3,4],完全符合连续type相同归为同一组的预期:
| type | group_num |
|---|---|
| in_progress | 1 |
| end | 2 |
| in_progress | 3 |
| in_progress | 3 |
| end | 4 |
内容的提问来源于stack exchange,提问作者user15920209
相关产品推荐
相关产品推荐

