pandas循环处理多个DataFrame并分别输出的实现问题
代码修改方案
原有代码的核心问题如下:
- 链式索引操作触发
SettingWithCopyWarning,修改仅作用于列切片副本,不会同步到原DataFrame - 循环内
pairs变量被反复覆盖,最终仅保留最后一组配对列,输出结果缺失其他列 - 未保留原DataFrame的完整结构,不符合输出要求
完整可运行代码
import pandas as pd import numpy as np # 测试数据 d1 = pd.DataFrame(data={'a':['yes', 'no', 'maybe', 'sometimes', np.nan], 'a_total': [5,12,4,np.nan,0], 'b': ['blue','orange','pink', np.nan, np.nan], 'b_total': [12,6,0,0, np.nan]}) d2 = pd.DataFrame(data={'y':['frog', 'snail', 'snake', 'spider', 'pig'], 'y_total': [182,32,13, np.nan,8], 'z': ['car','bike','walk', np.nan, np.nan], 'z_total': [12,6,np.nan,np.nan, np.nan]}) # 封装处理逻辑复用 def process_df(df): # 生成副本避免修改原始数据,不需要保留原数据可删除.copy() df = df.copy() # 提取所有不带_total后缀的普通列 normal_cols = [col for col in df.columns if not col.endswith('_total')] for col in normal_cols: total_col = f"{col}_total" # 跳过无对应统计列的普通列 if total_col not in df.columns: continue # 直接定位修改,规避链式索引问题 df.loc[ (df[col].notna()) & (df[total_col].isna()), total_col ] = 0 return df # 输出为存储DataFrame的字典 out = { 'd1': process_df(d1), 'd2': process_df(d2) } # 若需要直接更新d1、d2变量,替换为下方代码即可 # d1 = process_df(d1) # d2 = process_df(d2)
处理效果验证
- d1:a列索引3值为
sometimes(非空),对应a_total原NaN更新为0;b列索引4为NaN,对应b_total空值保留,符合需求。 - d2:y列索引3值为
spider(非空),对应y_total原NaN更新为0;z列索引2值为walk(非空),对应z_total原NaN更新为0,其余空值保留。
内容的提问来源于stack exchange,提问作者siash
相关产品推荐
相关产品推荐

