python - 使用 Pandas 分组的值的累积计数
问题描述
我有以下数据框:
>>>> df = pd.DataFrame(data={
'type': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'value': [0, 2, 3, 4, 0, 3, 2, 3, 0]})
>>> df
type value
0 A 0
1 A 2
2 A 3
3 B 4
4 B 0
5 B 3
6 C 2
7 C 3
8 C 0
我需要完成的是:对于每种类型,跟踪非零值的累积计数,但每次遇到 0 值时从零开始。
type value cumcount
0 A 0 NaN
1 A 2 1
2 A 3 2
3 B 4 1
4 B 0 NaN
5 B 3 1
6 C 2 1
7 C 3 2
8 C 0 NaN
解决方案
想法是创建连续组并过滤掉非0
值,最后使用过滤器分配给新列:
m = df['value'].eq(0)
g = m.ne(m.shift()).cumsum()[~m]
df.loc[~m, 'new'] = df.groupby(['type',g]).cumcount().add(1)
print (df)
type value new
0 A 0 NaN
1 A 2 1.0
2 A 3 2.0
3 B 4 1.0
4 B 0 NaN
5 B 3 1.0
6 C 2 1.0
7 C 3 2.0
8 C 0 NaN
对于 pandas 0.24+ 可以使用Nullable 整数数据类型:
df['new'] = df['new'].astype('Int64')
print (df)
type value new
0 A 0 NaN
1 A 2 1
2 A 3 2
3 B 4 1
4 B 0 NaN
5 B 3 1
6 C 2 1
7 C 3 2
8 C 0 NaN
推荐阅读
- azure - 导出的 Azure 资源组模板具有空参数
- python - 将绿色和蓝色值的奇偶校验检查到图像中
- html - ERROR Error: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe' even when returning an observable
- sql-server - 批量更新永远不会完成
- javascript - ReactJS:从索引集合(如 Int32Array 和 Float32Array)上的地图返回 div 或 span 返回 0 和 NaN
- flutter - Dart/Flutter 中的全局变量
- spring - 我如何使用 @Retryable(label="...") 进行日志记录或监控?
- java - @RequestBody 使用多个参数
- javascript - 无法使用 Node.js 连接到 mssql
- javascript - 获取PHP中多个选择框的值并将它们添加到数组中