如何通过动态公式从已有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
相关产品推荐
相关产品推荐

