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

基于列标签重命名并执行计算时遇AttributeError问题求助

问题分析与修复

错误原因

  1. 字符串方法误用:col是普通Python字符串,不是pandas的Series对象,不能调用str.contains()方法,直接用Python原生的字符串包含判断即可。
  2. 提前终止函数:else: return col会在第一次遇到不匹配的列时直接返回,导致后续列完全不处理,破坏了循环逻辑。
  3. 列操作逻辑错误:处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:46:07