插件窝 干货文章 Python Pandas中如何高效地根据上一行值创建并累加新列?

Python Pandas中如何高效地根据上一行值创建并累加新列?

累加 一行 df 方法 429    来源:    2025-03-11

在Pandas中,你可以使用shift方法来访问上一行的值,并结合cumsum方法来累加新列。以下是一个示例,展示如何高效地根据上一行的值创建并累加新列。

假设你有一个DataFrame df,其中包含一列 A,你想要创建一个新列 B,其中每一行的值是上一行 B 的值加上当前行 A 的值。

import pandas as pd

# 示例数据
data = {'A': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 初始化新列 B
df['B'] = 0

# 使用 shift 和 cumsum 来累加新列
df['B'] = df['A'].shift(1, fill_value=0).cumsum() + df['A']

print(df)

解释:

  1. shift(1): 将 A 列的值向下移动一行,这样你就可以访问上一行的值。fill_value=0 用于填充第一行的缺失值(因为没有上一行)。
  2. cumsum(): 对 A 列的值进行累加。
  3. + df['A']: 将累加的结果与当前行的 A 值相加,得到新列 B 的值。

输出:

   A   B
0  1   1
1  2   3
2  3   6
3  4  10
4  5  15

在这个例子中,B 列的值是 A 列的累加值。第一行的 B 值等于 A 的第一行值,第二行的 B 值等于第一行的 B 值加上第二行的 A 值,以此类推。

更通用的方法:

如果你想要根据上一行的 B 值来累加新列,可以使用 iterrowsapply 方法,但这种方法通常不如 shiftcumsum 高效。

import pandas as pd

# 示例数据
data = {'A': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 初始化新列 B
df['B'] = 0

# 使用 iterrows 来累加新列
for i, row in df.iterrows():
    if i == 0:
        df.at[i, 'B'] = df.at[i, 'A']
    else:
        df.at[i, 'B'] = df.at[i-1, 'B'] + df.at[i, 'A']

print(df)

输出:

   A   B
0  1   1
1  2   3
2  3   6
3  4  10
4  5  15

这种方法虽然直观,但在处理大数据集时可能会比较慢。因此,推荐使用 shiftcumsum 的组合来实现高效的计算。