使用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()
数据示例
| Group | Subgroup | pre_product_A | post_product_A | product_A_Change | pre_product_B | post_product_B | product_B_Change |
|---|---|---|---|---|---|---|---|
| Group A | Sub A | 100 | 150 | 50% | 100 | 150 | 50% |
| Group A | Sub B | 50 | 70 | 40% | 50 | 70 | 40% |
| Group B | Sub A | 60 | 20 | -67% | 60 | 70 | -67% |
| Group B | Sub B | 40 | 10 | -75% | 40 | 10 | -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
相关产品推荐
相关产品推荐

