如何用Python按ID分组截断并重新编号指定列
按ID分组截断开头重复runs值并重新编号的实现
问题描述
现有如下Pandas数据集:
import pandas as pd # 创建数据集 data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3], 'runs': [6, 6, 6, 6, 6,6,7,8,9,10, 3, 3, 3,4,5,6, 5, 5,5, 5,5,6,7,8], 'Children': ['No', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No'], 'Days': [123, 128, 66, 120, 141,123, 128, 66, 120, 141, 52,96, 120, 141, 52,96, 120, 141,123,15,85,36,58,89], } df = pd.DataFrame(data)
需求:
- 按
id分组,截断每个分组内开头连续重复的runs值对应的所有行(比如id=1截断开头所有runs=6的行,id=2截断开头所有runs=3的行) - 对每个分组剩余的行,从1开始生成连续编号
最终需要得到的结果示例:
| id | runs | Children | Days | 编号 |
|---|---|---|---|---|
| 1 | 7 | Yes | 128 | 1 |
| 1 | 8 | Yes | 66 | 2 |
| 1 | 9 | Yes | 120 | 3 |
| 1 | 10 | No | 141 | 4 |
| 2 | 4 | Yes | 141 | 1 |
| 2 | 5 | Yes | 52 | 2 |
| 2 | 6 | Yes | 96 | 3 |
| 3 | 6 | Yes | 36 | 1 |
| 3 | 7 | Yes | 58 | 2 |
| 3 | 8 | No | 89 | 3 |
实现步骤与代码
方法思路
- 按
id分组后,筛选出每个分组内runs值不等于分组第一行runs值的行,实现截断开头重复部分的效果 - 对筛选后的分组数据,生成从1开始的连续编号
代码实现
import pandas as pd # 创建数据集 data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3], 'runs': [6, 6, 6, 6, 6,6,7,8,9,10, 3, 3, 3,4,5,6, 5, 5,5, 5,5,6,7,8], 'Children': ['No', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No'], 'Days': [123, 128, 66, 120, 141,123, 128, 66, 120, 141, 52,96, 120, 141, 52,96, 120, 141,123,15,85,36,58,89], } df = pd.DataFrame(data) # 按id分组筛选掉开头重复的runs行 result = df.groupby('id').apply( lambda x: x[x['runs'] != x['runs'].iloc[0]] ).reset_index(drop=True) # 为每个id分组添加从1开始的连续编号 result['编号'] = result.groupby('id').cumcount() + 1 print("处理后结果:\n", result)
代码解释
groupby('id').apply(...):针对每个id分组执行筛选逻辑,只保留runs值与分组首行不同的行,直接截断开头重复的部分reset_index(drop=True):清除分组后产生的多级索引,恢复为常规DataFrame结构groupby('id').cumcount() + 1:对每个id分组从0开始计数,加1后得到从1起始的连续编号
运行代码后即可得到符合需求的结果。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

