python - 基于两个分类列的累积计数
问题描述
对于表中的每条记录,我想做一个基于两个分类列的累积计数。
在下表中,我想获取cum_count列,该列是根据行业和deal_status列计算的。这个想法是,对于每条记录,计算同一行业之前赢得的交易数量。
例如,表的最后一条记录有一个cum_count = 3,因为之前只看到了 3 笔交易状态=行业= x赢的交易。
Pandas的GroupBy.cumcount 函数对单个变量执行此操作...
对于我描述的情况,我怎样才能做到这一点?
pd.DataFrame({'time': [1, 2, 3, 4, 5, 6, 7],
'company' : ["ciaA", "ciaB", "ciaA", "ciaC", "ciaA", "ciaD", "ciaE"],
'industry' : ["x", "y", "x", "x", "x", "y", "x"],
'deal_status' : ["won", "lost", "won", "won", "lost", "won", "lost"],
'cum_count' : [0, 0, 1, 2, 3, 0, 3]})
time company industry deal_status cum_count
1 ciaA x won 0
2 ciaB y lost 0
3 ciaA x won 1
4 ciaC x won 2
5 ciaA x lost 3
6 ciaD y won 0
7 ciaE x lost 3
解决方案
创建一个辅助列,您将对其进行累计。需要在每个组内转移,因为您的计数仅包括以前的获胜值:
df['to_sum'] = (df.deal_status == 'won').astype(int)
df['cum_count'] = (df.groupby('industry')
.apply(lambda x: x.to_sum.shift(1).cumsum()).fillna(0)
.reset_index(0, drop=True))
输出df
:
time company industry deal_status to_sum cum_count
0 1 ciaA x won 1 0.0
1 2 ciaB y lost 0 0.0
2 3 ciaA x won 1 1.0
3 4 ciaC x won 1 2.0
4 5 ciaA x lost 0 3.0
5 6 ciaD y won 1 0.0
6 7 ciaE x lost 0 3.0
推荐阅读
- string - Kotlin - 如何从 charRange '0..'z' 中获取 5 个(或选定的数字)随机字符
- javascript - 选择选项 - 多行显示的长文本
- winapi - 如何修复 NtAllocateVirtualMemory 上的退出代码 0xc0000005 (STATUS_ACCESS_VIOLATION)?
- vue.js - Vue 3 Vuex 如何强制回调函数异步运行
- bdd - 如何使用不同的对象使 Serenity BDD 功能文件中的步骤动态化
- git - 创建一个新分支以在 git 中重新初始化整个项目
- spring - 是否可以 @CacheEvict 匹配模式的键?
- firebase - 在飞镖颤动的列表中循环
- linux - 如何将本地用户添加到我的 docker 容器中?
- javascript - 检查元素是否在 x 秒前创建