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

使用for循环计算DataFrame中多产品的前后数值变化百分比

Pandas批量计算多产品pre/post变化百分比

我有一个包含Group、Subgroup以及各产品pre_xxx、post_xxx数值的DataFrame,需要计算每款产品的变化百分比(公式:(post值/pre值 - 1),保留两位小数,示例见表格第5、8列)。目前有10款产品需要计算,手动逐个创建新列操作重复繁琐,尝试编写的for循环未成功,求批量实现的方法。

尝试的错误循环代码

def myfunc(a, b):
    return b/a-1
res = [myfunc(a, b) for a, b in zip(a, b)]

for a in [pre_product_A,pre_product_B]:
    for b in [post_product_A,post_product_B]:
        myfunc(a, b)

res

当前可行但重复的代码

df['product_A_Change'] = (df.post_product_A/df.pre_product_A -1).round(2)
df['product_B_Change'] = (df.post_product_B/df.pre_product_B -1).round(2)

df.head()

数据示例

GroupSubgrouppre_product_Apost_product_Aproduct_A_Changepre_product_Bpost_product_Bproduct_B_Change
Group ASub A10015050%10015050%
Group ASub B507040%507040%
Group BSub A6020-67%6070-67%
Group BSub B4010-75%4010-75%

解决方案

方法1:提取产品名称批量循环

先从DataFrame列名中提取所有产品名称,再逐个计算对应变化百分比列:

# 提取所有产品名称(从pre_开头的列中移除前缀)
products = [col.split('pre_')[-1] for col in df.columns if col.startswith('pre_')]

# 循环计算每个产品的变化百分比
for product in products:
    df[f'{product}_Change'] = (df[f'post_{product}'] / df[f'pre_{product}'] - 1).round(2)

方法2:简洁链式操作(可选)

如果想避免显式循环,可用pd.concat结合列表推导式:

# 生成所有变化百分比列
change_cols = pd.concat(
    [(df[f'post_{p}'] / df[f'pre_{p}'] - 1).round(2).rename(f'{p}_Change') 
     for p in [col.split('pre_')[-1] for col in df.columns if col.startswith('pre_')]],
    axis=1
)

# 合并到原DataFrame
df = pd.concat([df, change_cols], axis=1)

错误循环的问题说明

你之前的嵌套循环会把所有pre_列和post_列两两配对(比如pre_product_A和post_product_B),不符合"同一产品pre/post对应计算"的需求。正确逻辑是按产品名称分组,让每个产品的pre和post列一一对应计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:40