基于熊猫条件的列值总和

拉姆西
daychange   SS
0.017065    0
-0.009259   100
0.031542    0
-0.004530   0
0.000709    0
0.004970    100
-0.021900   0
0.003611    0

我有两列,如果SS = 100,我想计算下5个“ daychange”的总和。

我现在正在使用以下内容,但是它并不能完全按照我想要的方式工作:

df['total'] = df.loc[df['SS'] == 100,['daychange']].sum(axis=1) 
迈克尔·斯切斯尼(Michael Szczesny)

由于pandas 1.1您可以创建前滚窗口并选择要包含在数据框中的行。我的笔记本内核使用不同的参数终止了:谨慎使用。

indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=5)
df['total'] = df.daychange.rolling(indexer, min_periods=1).sum()[df.SS == 100]
df

出:

   daychange   SS     total
0   0.017065    0       NaN
1  -0.009259  100  0.023432
2   0.031542    0       NaN
3  -0.004530    0       NaN
4   0.000709    0       NaN
5   0.004970  100 -0.013319
6  -0.021900    0       NaN
7   0.003611    0       NaN

SS == 100从总和中排除起始行

那是带有的行之后的下一行SS == 100由于所有行均已计算,因此您可以使用

df['total'] = df.daychange.rolling(indexer, min_periods=1).sum().shift(-1)[df.SS == 100]
df

出:

   daychange   SS     total
0   0.017065    0       NaN
1  -0.009259  100  0.010791
2   0.031542    0       NaN
3  -0.004530    0       NaN
4   0.000709    0       NaN
5   0.004970  100 -0.018289
6  -0.021900    0       NaN
7   0.003611    0       NaN

使用选定行的索引的慢速hacky解决方案

感觉就像是骇客,但可以避免计算不必要的滚动值

df['next5sum'] = df[df.SS == 100].index.to_series().apply(lambda x: df.daychange.iloc[x: x + 5].sum())
df

出:

   daychange   SS  next5sum
0   0.017065    0       NaN
1  -0.009259  100  0.023432
2   0.031542    0       NaN
3  -0.004530    0       NaN
4   0.000709    0       NaN
5   0.004970  100 -0.013319
6  -0.021900    0       NaN
7   0.003611    0       NaN

对于接下来的五行之和(不包括行),SS == 100您可以调整切片或移动序列

df['next5sum'] = df[df.SS == 100].index.to_series().apply(lambda x: df.daychange.iloc[x + 1: x + 6].sum())
# df['next5sum'] = df[df.SS == 100].index.to_series().apply(lambda x: df.daychange.shift(-1).iloc[x: x + 5].sum())

df

出:

   daychange   SS  next5sum
0   0.017065    0       NaN
1  -0.009259  100  0.010791
2   0.031542    0       NaN
3  -0.004530    0       NaN
4   0.000709    0       NaN
5   0.004970  100 -0.018289
6  -0.021900    0       NaN
7   0.003611    0       NaN
7   0.003611    0       NaN

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章