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
相关产品推荐
相关产品推荐

