You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+Pandas:无迭代实现DataFrame的Result列计算

解决Pandas DataFrame非迭代填充Result列的方案

嘿,这个需求我刚好处理过类似的,用Pandas的向量化操作就能完美搞定,完全不需要循环迭代,效率拉满,适合大数据量场景。咱们一步步来实现:

步骤1:构造示例数据

首先先把你给出的数据转换成可运行的DataFrame:

import pandas as pd
import numpy as np

# 你的原始数据
data = {
    'A': [20, 21, 22, 23, 24, 25, 26, 27],
    'B': [1, 0, 0, 1, 0, 0, 1, 0],
    'C': [0, 0, 0, 0, 0, 1, 0, 1],
    'Result': [0, 0, 0, 0, 0, 0, 0, 0]
}
df = pd.DataFrame(data)

步骤2:生成每个行之后最近的C=1对应的A值

核心思路是先找到所有C=1的行的A值,然后给每一行匹配它之后第一个出现的C=1的A值。这里用反向填充的技巧实现:

# 生成辅助列:存储当前行之后第一个C=1的A值
df['next_c1_A'] = df['A'].where(df['C'] == 1).iloc[::-1].ffill().iloc[::-1]

代码解释:

  • df['A'].where(df['C'] == 1):只保留C=1的行的A值,其他行设为NaN
  • .iloc[::-1]:把数据倒序排列(从最后一行到第一行)
  • .ffill():向前填充NaN,这样倒序后每个NaN都会被最近的C=1的A值填充(对应原顺序中“后面的”C=1值)
  • .iloc[::-1]:再把数据倒回原顺序,这样每个位置就得到了原顺序中之后第一个C=1的A值

步骤3:按规则填充Result列

现在直接用np.where做向量化判断填充:

# 按规则填充Result列
df['Result'] = np.where(df['B'] == 0, 0, df['A'] + df['next_c1_A'])

# 可以删掉辅助列(如果不需要的话)
df.drop('next_c1_A', axis=1, inplace=True)

最终结果

运行后得到的DataFrame就是你要的结果:

A  B  C  Result
0  20  1  0      45
1  21  0  0       0
2  22  0  0       0
3  23  1  0      48
4  24  0  0       0
5  25  0  1       0
6  26  1  0      53
7  27  0  1       0

为什么不用迭代?

这种向量化操作是Pandas的最优实践,相比循环迭代,它底层用C实现,处理百万级数据的速度能快几十甚至上百倍,完全避免了Python循环的性能瓶颈。

内容的提问来源于stack exchange,提问作者576KB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:32:34