Pandas实现按user和code分组的自定义增减计数器列
解决方案
实现步骤
- 映射动作到增量值:将
action列的OUT转为1,IN转为-1,简化后续计算逻辑。 - 分组累积求和:按
user和code分组后,对增量值计算累积和,得到计数器的初步变化趋势。 - 强制非负修正:对累积和结果取与
0的最大值,确保任何时刻计数器都不会出现负数。
代码示例
先模拟一个符合你描述的DataFrame:
import pandas as pd df = pd.DataFrame({ 'user': ['U1', 'U1', 'U1', 'U2', 'U2', 'U2'], 'code': ['C001', 'C001', 'C001', 'C002', 'C002', 'C002'], 'action': ['OUT', 'IN', 'OUT', 'IN', 'OUT', 'OUT'] })
执行以下代码即可实现需求:
# 1. 给动作映射增量值 df['delta'] = df['action'].replace({'OUT': 1, 'IN': -1}) # 2. 分组计算累积和,同时强制结果非负 df['counter'] = df.groupby(['user', 'code'])['delta'].cumsum().clip(lower=0) # 可选:删除中间辅助列delta df = df.drop('delta', axis=1)
结果示例
运行后得到的counter列完全符合预期:
| user | code | action | counter |
|---|---|---|---|
| U1 | C001 | OUT | 1 |
| U1 | C001 | IN | 0 |
| U1 | C001 | OUT | 1 |
| U2 | C002 | IN | 0 |
| U2 | C002 | OUT | 1 |
| U2 | C002 | OUT | 2 |
关键细节
clip(lower=0)可以直接把所有负值修正为0,完美解决“计数器不允许为负”的要求。- 分组后使用
cumsum()实现逐行累积计算,保证每个user+code组合的计数器独立变化。
内容的提问来源于stack exchange,提问作者Unsullied
相关产品推荐
相关产品推荐

