如何使用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
相关产品推荐
相关产品推荐

