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

如何在Pandas中向量化计算填充available_wheat列?规避iterrows

解决方案

问题回顾

需要基于初始的available_wheat值,按usage rate (%)的比例逐行递减计算后续的available_wheat,同时算出consumption,且要替代效率低下的iterrows循环,用向量化方法处理大数据量。

向量化实现代码

直接利用Pandas的累积乘积(cumprod)实现向量化计算,完全避免循环,效率大幅提升:

import pandas as pd

# 构造示例DataFrame(实际使用时替换为你的数据)
df = pd.DataFrame({
    'County': ['A']*12,
    'date': ['1/2/2021', '1/3/2021', '1/4/2021', '1/5/2021', '1/6/2021', '1/7/2021',
             '1/8/2021', '1/9/2021', '1/10/2021', '1/11/2021', '1/12/2021', '1/13/2021'],
    'available_wheat': [100.00] + [None]*11,
    'usage rate (%)': [3,3,2,5,1,2,5,6,7,8,1,2],
    'consumption': [None]*12
})

# 1. 计算每一期的留存率(1 - 使用率)
retention = 1 - df['usage rate (%)'] / 100

# 2. 填充available_wheat:初始值 × 前序所有留存率的累积乘积
# shift(1)让每一期使用上一期的留存率,fillna(1)保证第一期用初始值
df['available_wheat'] = df.loc[0, 'available_wheat'] * retention.shift(1).fillna(1).cumprod()

# 3. 计算当期消耗:当期可用量 × 当期使用率
df['consumption'] = df['available_wheat'] * (df['usage rate (%)'] / 100)

# 保留两位小数,匹配预期输出
df = df.round(2)

多分组场景适配

如果你的数据包含多个County(需要按分组独立计算),可以结合groupby和自定义函数实现:

def calculate_wheat_group(group):
    # 获取当前分组的初始可用小麦量
    initial_val = group.loc[group['available_wheat'].first_valid_index(), 'available_wheat']
    retention = 1 - group['usage rate (%)'] / 100
    # 按分组计算可用量和消耗量
    group['available_wheat'] = initial_val * retention.shift(1).fillna(1).cumprod()
    group['consumption'] = group['available_wheat'] * (group['usage rate (%)'] / 100)
    return group.round(2)

# 按County分组计算
df = df.groupby('County').apply(calculate_wheat_group)

效果说明

运行后得到的结果完全匹配你给出的预期输出,且向量化操作的时间复杂度远低于循环,在大数据量下(比如百万级行),速度会比iterrows快几十甚至上百倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:50:40