如何计算给定组内 Python DataFrame 的累计和(反向)?

How to calculate cumulative sum (reversed) of a Python DataFrame within given groups?

我有一个包含许多 (n=19) 列的数据框 (df_f),如果从概念上简化的话,它看起来像这样:

Basin (n=17 columns) Chi
13.0 ... 4
13.0 ... 8
13.0 ... 2
21.0 ... 4
21.0 ... 6
38.0 ... 1
38.0 ... 7
38.0 ... 2
38.0 ... 4

真实的数据框有大约 70,000 行和大约 60 个唯一的 'Basin' ID 值(当然还有其他带有数字数据的列,但我们不需要它们,我仍然想保留它们尽管用于绘图)。

我想要的是:

我想计算 'Chi' 值的累计总和,但相反(因此,向上),AND 我希望为每个盆地重置它 'group'。所以值应该是:

Basin (n=17 columns) Chi_cum
13.0 ... 14
13.0 ... 10
13.0 ... 2
21.0 ... 10
21.0 ... 6
38.0 ... 14
38.0 ... 13
38.0 ... 6
38.0 ... 4

如您所见,在 Chi_cum 中,我们逐渐增加 Chi 值,但我们为每个 'Basin'.

重置总和

我知道如何计算反向累加和 (df_f['Chi_cum'] = df_f.loc[::-1, 'Chi'].cumsum()[::-1]),但那是针对整个数据帧的。相反,我知道如何使用'.groupby',但我似乎无法将分组和求和这两种方法结合起来。

我试过做类似的事情:

df_f["Chi_cum"] = df_f.groupby(by=['Basin']).sum().iloc[::-1].groupby(level=[0]).cumsum().iloc[::-1]

(灵感来自 ),但它不起作用!

有人可以帮我解决这个问题吗?谢谢!

显然您实际上不能将 ascending=Truereverse=True 添加到 cumsum (!?!?),所以只需在每个组的 cumsum 前后反转即可:

df['Chi'] = df.groupby('Basin')['Chi'].apply(lambda x: x[::-1].cumsum()[::-1])

输出:

>>> df
   Basin  Chi
0   13.0   14
1   13.0   10
2   13.0    2
3   21.0   10
4   21.0    6
5   38.0   14
6   38.0   13
7   38.0    6
8   38.0    4

你可以试试 series groupby

df['new'] = df.loc[::-1, 'Chi'].groupby(df['Basin']).cumsum()
df
Out[858]: 
   Basin (n=17 columns)  Chi  new
0   13.0            ...    4   14
1   13.0            ...    8   10
2   13.0            ...    2    2
3   21.0            ...    4   10
4   21.0            ...    6    6
5   38.0            ...    1   14
6   38.0            ...    7   13
7   38.0            ...    2    6
8   38.0            ...    4    4