Cumsum 作为现有 Pandas 数据框中的新列

问题描述 投票:0回答:2

我有一个 pandas 数据框定义为:

A   B   SUM_C      
1   1   10     
1   2   20   

我想计算 SUM_C 的累积和,并将其作为新列添加到同一数据帧中。换句话说,我的最终目标是拥有一个如下所示的数据框:

A   B   SUM_C   CUMSUM_C       
1   1   10      10     
1   2   20      30   

在 pandas 中的 group() 上使用 cumsum 显示了生成新数据框的可能性,其中列名 SUM_C 被替换为累积和。但是,我的要求是将累积总和作为新列添加到现有数据帧中。

python pandas dataframe cumsum
2个回答
94
投票

只需将

cumsum
应用于
pandas.Series
df['SUM_C']
并将其分配给新列:

df['CUMSUM_C'] = df['SUM_C'].cumsum()

结果:

df
Out[34]: 
   A  B  SUM_C  CUMSUM_C
0  1  1     10       10
1  1  2     20       30

0
投票

您还可以分配多列的累积和,并将它们一次性分配为新列。

df = pd.DataFrame({"A": [1, 1, 2, 3], "B": [1, 2, 4, 4], "C": [4, 2, 1, 5]})

# cumsum of columns A and B
df[["CUMSUM_A", "CUMSUM_B"]] = df[["A", "B"]].cumsum()

multi-column cumsum

此外,通过设置

axis=1
(默认为
axis=0
),您也可以计算逐行累加。

# row-wise cumulative sum of columns A, B and C
df[["A+", "A+B", "A+B+C"]] = df[["A", "B", "C"]].cumsum(axis=1)

row-wise cumsum

您还可以使用 Python 中的任何其他方法计算 cumsum 并将结果分配回 pandas 列。例如,

numpy.cumsum
(pandas 附带)或
itertools.accumulate
(在标准库中)也同样有效。

df["CUMSUM_D"] = np.cumsum(df["SUM_C"])

from itertools import accumulate
df["CUMSUM_E"] = list(accumulate(df["SUM_C"]))

如果原始数据帧是从另一个数据帧创建的,则简单地按上述方式分配可能会引发

SettingWithCopyWarning
。在这种情况下,在分配之前,将写时复制模式设置为 True。

pd.options.mode.copy_on_write = True   # <--- enable copy-on-write
df["CUMSUM"] = df["A"].cumsum()        # <--- assign

或者您可以使用

assign
join
创建全新的副本:

# for a single column:
df = df.assign(CUMSUM=df["A"].cumsum())

# for multiple columns:
df = df.join(df[["A", "B"]].cumsum().set_axis(["CUMSUM_A", "CUMSUM_B"], axis=1))
© www.soinside.com 2019 - 2024. All rights reserved.