python - Python - 对组内的条件运行计数
问题描述
我有以下数据框:
data = pd.DataFrame({
'ID': ['A','A','A','B','B','C','C','C','C','C','D','E','E','F'],
'Button': ['Begin','Begin','End','Begin','End','Begin','End','Begin','Begin','End','Begin','Begin','End','End']
})
通过唯一的“ID”,我想通过运行计数将行组合在一起,直到字符串“End”出现在 Button 列中。例如,分配给 ID = 'C' 的 5 行应分成两组(1 和 2),因为有两行包含 'End'。ID = 'D' 不应分组,因为没有使用字符串 'End' 分配给 Id = 'D' 的行。
result = pd.DataFrame({
'ID': ['A','A','A','B','B','C','C','C','C','C','D','E','E','F'],
'Button': ['Begin','Begin','End','Begin','End','Begin','End','Begin','Begin','End','Begin','Begin','End','End'],
'Count': [1,1,1,1,1,1,1,2,2,2,0,1,1,1]
})
我该怎么办?
解决方案
IIUC,我们可以首先将每个“结束”设为 1,将其他所有内容设为 NaN。然后对于每个 ID 组,我们可以取累积和(计算 Ends)并回填以将所有 Begins 设置为适当的数字。最后,我们可以用 0 填充任何剩余的 NaN,因为它们是组中没有任何 End 的情况。
爱荷华州:
In [263]: ends = (data["Button"] == "End").replace(False, np.nan)
In [264]: data["Count"] = ends.groupby(data["ID"]).apply(
lambda x: x.cumsum().bfill()).fillna(0).astype(int)
In [265]: data
Out[265]:
ID Button Count
0 A Begin 1
1 A Begin 1
2 A End 1
3 B Begin 1
4 B End 1
5 C Begin 1
6 C End 1
7 C Begin 2
8 C Begin 2
9 C End 2
10 D Begin 0
11 E Begin 1
12 E End 1
13 F End 1
推荐阅读
- c++ - 在具有不同模板参数集的模板类中使用模板化对象
- nanoframework - esp32 cam板串行上的.net Nano框架没有响应
- swiftui - 如何在 SwiftUI 中水平翻转形状?
- kubernetes - k8s 部署 EFS VolumeMount 仅作为 root:root 所有者安装,我如何指定特定用户?
- c - 为什么 C 头文件中的全局变量定义有效?
- laravel - Laravel 8:如何在多对多关系中播种数据透视表
- bash - 将函数调用分配给变量时终止 bash 脚本
- python - 自动将 matplotlib 图上传到非常简单的 http 服务器
- html - 如何将项目与弹性框方向列垂直对齐?
- javascript - 使用 jwt 验证 Web 套接字连接是否安全?