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

如何通过动态公式从已有DataFrame生成新的DataFrame?

问题描述

现有如下DataFrame:

df_1 = pd.DataFrame({
    'col1' : [20, 60, 55, 80, 32, 33],
    'col2' : [10, 16, 18, 12, 19, 20],
    'col3' : [5, 2, 7, 9, 1, 2]
})

展示效果:

col1 col2 col3
0   20  10  5
1   60  16  2
2   55  18  7
3   80  12  9
4   32  19  1
5   33  20  2

需要对每列应用公式 (x**coef - 1) / coef,其中各列对应的系数为 coef = [0.2, 0.3, 0.4],得到目标DataFrame df_2:

col1        col2        col3
0   4.102821    3.317541    2.259135
1   6.339666    4.324656    0.798770
2   6.144037    4.600088    2.944766
3   7.011244    3.691453    3.520562
4   5.000000    4.729818    0.000000
5   5.061733    4.854854    0.798770

当前实现代码为:

coefs = [0.2, 0.3, 0.4]
df_2 = pd.DataFrame()
cols = df_1.columns
df_2[cols[0]] = (df_1[cols[0]]**coefs[0] - 1)/ coefs[0] 
df_2[cols[1]] = (df_1[cols[1]]**coefs[1] - 1)/ coefs[1]
df_2[cols[2]] = (df_1[cols[2]]**coefs[2] - 1)/ coefs[2]

希望找到更简洁的实现方式。


解决方案

方法1:字典推导式(简洁易读)

通过zip将列名与对应系数绑定,用字典推导式直接构造结果DataFrame:

coefs = [0.2, 0.3, 0.4]
df_2 = pd.DataFrame({
    col: (df_1[col] ** coef - 1) / coef
    for col, coef in zip(df_1.columns, coefs)
})

方法2:向量化运算(性能最优)

利用pandas/numpy的广播机制,直接对整个DataFrame进行向量化运算,代码最短且效率最高:

import numpy as np

coefs = np.array([0.2, 0.3, 0.4])
df_2 = (df_1 ** coefs - 1) / coefs

pandas会自动将系数数组与每列对应,完成逐列运算。

方法3:简化循环

如果倾向用循环,可通过遍历列索引简化代码:

coefs = [0.2, 0.3, 0.4]
df_2 = df_1.copy()
for idx, coef in enumerate(coefs):
    df_2.iloc[:, idx] = (df_2.iloc[:, idx] ** coef - 1) / coef

方法4:使用apply方法

通过apply配合args传递系数数组,逐列处理:

coefs = [0.2, 0.3, 0.4]
df_2 = df_1.apply(lambda col, coef: (col ** coef - 1) / coef, args=coefs)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:40:24