如何使用Pandas groupby为分组新增X、Y独立计数的序列列
实现方案
你可以通过pandas的分组累计求和功能直接生成目标列,示例代码如下:
import pandas as pd # 假设df为你的原始数据集,已包含c1、c2两列 # 按c1分组,累计统计每个分组内X出现的次数生成Ct_X df['Ct_X'] = df.groupby('c1')['c2'].transform(lambda x: (x == 'X').cumsum()) # 按c1分组,累计统计每个分组内Y出现的次数生成Ct_Y df['Ct_Y'] = df.groupby('c1')['c2'].transform(lambda x: (x == 'Y').cumsum())
如果处理的数据量较大,也可以用下面的写法,避免lambda带来的性能损耗:
import pandas as pd df['is_X'] = (df['c2'] == 'X').astype(int) df['Ct_X'] = df.groupby('c1')['is_X'].cumsum() df['is_Y'] = (df['c2'] == 'Y').astype(int) df['Ct_Y'] = df.groupby('c1')['is_Y'].cumsum() # 删除临时生成的辅助列 df = df.drop(columns=['is_X', 'is_Y'])
逻辑说明
- 对
c1列分组保证每个分组的计数独立,切换c1取值时计数自动重置 - 用
(x == 'X')生成布尔序列,对应位置为X时值为True(等价于数值1),否则为False(等价于数值0) - 调用
cumsum()做累计求和,刚好符合遇到对应类别计数+1、其他情况计数不变的需求,和你给出的预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Terry Bogard
相关产品推荐
相关产品推荐

