Pandas中为不同列匹配对应常数相乘的更优雅实现方法问询
替代For循环实现Pandas列按对应常数乘法并生成MultiIndex列
方法1:批量处理列后合并(推荐)
通过批量选择目标列、执行向量化运算,再重命名列并合并到原DataFrame,完全避免循环:
import pandas as pd import numpy as np np.random.seed(0) const_val=dict(a_b_c=15, dd_ee=20, ff_ff=15, abc=15, devb=20,) df = pd.DataFrame(data=np.random.randint(5, size=(3, 6)), columns=['id','a_b_c','dd_ee','ff_ff','abc','devb']) reval=6 # 批量处理目标列:按字典匹配常数完成乘法 processed_cols = df[const_val.keys()].mul(const_val, axis=1) / reval # 将新列名转换为MultiIndex格式 processed_cols.columns = pd.MultiIndex.from_tuples([('per_a', col) for col in processed_cols.columns]) # 合并到原DataFrame df = df.join(processed_cols)
方法2:用assign结合字典推导式
一行代码完成所有新列的添加,利用字典推导式生成每个MultiIndex列的计算逻辑:
df = df.assign(**{('per_a', col): df[col] * val / reval for col, val in const_val.items()})
结果验证
两种方法生成的DataFrame与原For循环实现的结果完全一致,最终列结构包含MultiIndex格式的新列:
id a_b_c dd_ee ff_ff abc devb (per_a, a_b_c) (per_a, dd_ee) (per_a, ff_ff) (per_a, abc) (per_a, devb) 0 4 0 3 3 3 1 0.0 10.0 7.5 7.5 3.333333 1 3 2 4 0 0 4 5.0 13.333333 0.0 0.0 13.333333 2 2 1 0 1 1 0 2.5 0.0 2.5 2.5 0.000000
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

