如何计算给定组内 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=True
或 reverse=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
我有一个包含许多 (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=True
或 reverse=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