我有一个 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 被替换为累积和。但是,我的要求是将累积总和作为新列添加到现有数据帧中。
只需将
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
您还可以分配多列的累积和,并将它们一次性分配为新列。
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()
此外,通过设置
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)
您还可以使用 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))