python - 熊猫:有两个条件的组内累计和
问题描述
我有一个如下表所示的 DataFrame:
指数 | X | 是的 | 值_1 | cumsum_1 | cumsum_2 |
---|---|---|---|---|---|
0 | 0.1 | 1 | 12 | 12 | 0 |
1 | 1.2 | 1 | 10 | 12 | 10 |
2 | 0.25 | 1 | 7 | 19 | 10 |
3 | 1.0 | 2 | 3 | 0 | 3 |
4 | 0.72 | 2 | 5 | 5 | 10 |
5 | 1.5 | 2 | 10 | 5 | 13 |
所以我的目标是计算value_1
. 但有两个条件必须考虑。
- 第一:如果 value
x
小于 1cumsum()
则写入 columncumsum_1
,如果x
大于 columncumsum_2
。 - 第二:列
y
表示组(1、2、3、...)。当 in 的值y
发生变化时,-cumsum()
操作会重新开始。我认为该grouby()
方法会有所帮助。
有人知道吗?
解决方案
可以使用.where()
on conditions x
< 1 or x
>= 1根据条件临时修改value_1
为0,然后groupby cumsum,如下:
第二个条件由.groupby
函数满足,而第一个条件由.where()
函数满足,详述如下:
.where()
当条件为真时保留列值,当条件为假时更改值(在本例中为 0)。因此,对于列x
< 1 的第一个条件,value_1
将保留其值以馈送到后续cumsum
步骤以累积 的过滤值value_1
。对于条件x
< 1 为 False 的行,value_1
其值被屏蔽为 0。传递给cumsum
累积的这些 0 实际上与将累积的原始值取出value_1
到 column中的效果相同cumsum_1
。
第二行代码将value_1
值累加到cumsum_2
具有相反条件x
>= 1 的列中。这 2 行代码实际上分别根据value_1
< 1 和cumsum_1
> = 1 分配。cumsum_2
x
x
(感谢@tdy 简化代码的建议)
df['cumsum_1'] = df['value_1'].where(df['x'] < 1, 0).groupby(df['y']).cumsum()
df['cumsum_2'] = df['value_1'].where(df['x'] >= 1, 0).groupby(df['y']).cumsum()
结果:
print(df)
x y value_1 cumsum_1 cumsum_2
0 0.10 1 12 12 0
1 1.20 1 10 12 10
2 0.25 1 7 19 10
3 1.00 2 3 0 3
4 0.72 2 5 5 3
5 1.50 2 10 5 13
推荐阅读
- python - PiCamera - 如何将“rgb”格式的 np.array 捕获保存到文件中?
- sql - PostgreSQL 随机子查询
- javascript - 我应该使用哪个功能?.toDataURL() 还是 .toBlob()?
- android - Android VideoView 不会在树莓派上播放视频
- google-apps-script - Ebay API:ActiveInventoryReport 数据
- typo3 - 如何在文件夹中隐藏后端布局
- failovercluster - 将 Hypervisor 添加回故障转移集群
- ios - 如何使 Xcode segues 不可逆?
- android - Constraint Layout中对多个视图进行分组,只设置一个点击监听
- javascript - eventemitter.emit 方法不会在节点 js 中返回