You need to enable JavaScript to run this app. 如何使用pandas apply函数批量替换DataFrame中指定索引的整行数据
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pandas apply函数批量替换DataFrame中指定索引的整行数据

问题根因

你代码的核心问题是apply_imputation函数的返回值类型不符合预期:

  • 当row['imp_flag'] == 1时,你返回的是df[df.index == row.donor_index],这是一个单行DataFrame对象,不是axis=1要求返回的单行Series对象
  • 两种不同类型的返回值(部分是Series、部分是DataFrame)被pandas拼接时发生类型异常,就出现了列名被拆分为字符元组的错误结果

修正方案

方案1:修改现有apply逻辑(小数据量适用)

把apply_imputation的返回值调整为单行Series,同时注意处理donor_index的浮点数转索引整数的问题:

def apply_imputation(df, row):
    # 转成int匹配索引类型,用loc取单行直接返回Series
    return df.loc[int(row.donor_index)]

df = df.apply(lambda row : apply_imputation(df, row) if row['imp_flag'] == 1 else row, axis=1)

方案2:批量赋值(性能更优,推荐大数据量用)

完全不用apply,用pandas向量化操作实现,效率高很多:

# 筛选出需要替换的行
imp_mask = df['donor_index'].notna() & (df['imp_flag'] == 1)
# 提取对应donor行的数值批量赋值
df.loc[imp_mask] = df.loc[df.loc[imp_mask, 'donor_index'].astype(int)].values

如果不需要覆盖donor_index、donor_possible_indexes等标记列,可指定要替换的列范围:

cols_to_replace = df.columns.difference(['donor_possible_indexes', 'donor_index', 'imp_flag'])
df.loc[imp_mask, cols_to_replace] = df.loc[df.loc[imp_mask, 'donor_index'].astype(int), cols_to_replace].values

内容的提问来源于stack exchange,提问作者seal36

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:51:03