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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:06:03