如何在Pandas中对DataFrame列做除法运算并保留原列名?
解决Pandas计算列保留原列名的问题
问题场景
现有如下DataFrame:
ID,WEIGHT,I1,I2,I4 1,0.2,839,1664,3266 2,0.1,851,863,858 3,0.4,1018,1999,3982 4,0.3,878,1724,3447
遍历I2、I4列(对应原代码中range(3,5)的索引),生成包含WEIGHT列与I_i/I1计算结果的新DataFrame,但原代码输出的计算列名变为0,需要保留原列名(如I2、I4)。
解决方案
原问题核心是计算后的Series未保留原列名,导致concat后列名被默认设为0,以下是几种简单修复方法:
方法1:给计算结果重命名原列名
计算比值后手动给Series指定原列名,再进行拼接:
import pandas as pd # 读取或构造原DataFrame df = pd.read_csv('你的数据文件路径.csv') for i in range(3,5): col_name = df.columns[i] # 获取当前列的原名称 # 计算比值并绑定原列名 ratio_col = (df.iloc[:,i] / df.iloc[:,2]).rename(col_name) # 拼接WEIGHT列和计算列 df_new = pd.concat([df['WEIGHT'], ratio_col], axis=1) print(df_new)
方法2:直接构造新DataFrame(更直观)
不用concat,直接用字典构造新DataFrame,明确指定列名:
for i in range(3,5): col_name = df.columns[i] df_new = pd.DataFrame({ 'WEIGHT': df['WEIGHT'], col_name: df.iloc[:,i] / df.iloc[:,2] }) print(df_new)
方法3:遍历列名而非索引(更易维护)
避免依赖列的索引位置,直接遍历目标列名,代码可读性更强:
# 指定需要处理的列 target_cols = ['I2', 'I4'] for col in target_cols: df_new = pd.DataFrame({ 'WEIGHT': df['WEIGHT'], col: df[col] / df['I1'] }) print(df_new)
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

