基于列标签重命名并执行计算时遇AttributeError问题求助
问题分析与修复
错误原因
- 字符串方法误用:
col是普通Python字符串,不是pandas的Series对象,不能调用str.contains()方法,直接用Python原生的字符串包含判断即可。 - 提前终止函数:
else: return col会在第一次遇到不匹配的列时直接返回,导致后续列完全不处理,破坏了循环逻辑。 - 列操作逻辑错误:处理distance列时,你先修改了循环变量
col的名称,再试图用新名称访问列,此时该列还不存在,会引发KeyError,正确的做法是基于原列计算后创建新列或修改原列。
修复后的代码
方案1:创建新列(保留原distance和USD列)
import pandas as pd import numpy as np def convert_units(df): # 遍历所有列 for col in df.columns: if "distance" in col: # 创建新列,后缀改为_m,值转换为米 new_col = col.replace("_km", "_m") df[new_col] = df[col] * 1000 elif "costinUSD" in col: # 转换为EUR,并重命名列 new_col = col.replace("USD", "EUR") df[new_col] = df[col] * 0.95 return df # 测试 toy_df = pd.DataFrame(data=np.random.rand(50,8), columns = ('A_distance_km', 'A_costinUSD', 'B_distance_km' ,'B_costinUSD', 'C_distance_km', 'C_costinUSD', 'D_dosomething', 'D_dosomethingelse')) processed_df = convert_units(toy_df) print(processed_df.columns)
方案2:直接修改原列(替换原数据和列名)
如果你不需要保留原列,可以直接修改,更节省内存,适合大型DataFrame:
def convert_units(df): # 批量处理数值转换 distance_cols = [col for col in df.columns if "distance" in col] df[distance_cols] = df[distance_cols] * 1000 cost_cols = [col for col in df.columns if "costinUSD" in col] df[cost_cols] = df[cost_cols] * 0.95 # 批量重命名列 rename_mapping = {} for col in df.columns: if "distance_km" in col: rename_mapping[col] = col.replace("_km", "_m") elif "costinUSD" in col: rename_mapping[col] = col.replace("USD", "EUR") df = df.rename(columns=rename_mapping) return df
内容的提问来源于stack exchange,提问作者byc
相关产品推荐
相关产品推荐

