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

求助:Python循环/函数修改多同表头DataFrame失效问题

问题排查与解决方案

循环失效的核心原因

  • 循环变量重新赋值导致原对象未更新:循环里的df = df.drop(...)、df = df[df['C'].isin(...)]都是生成新的DataFrame,把df指向了新对象,但原来的df1、df2(也就是列表里最初的引用)根本没变化,相当于白改。
  • drop方法参数错误:df.drop(df[P1], axis=1)是错的,应该直接传列名列表P1,df[P1]是取出的列数据,不是列名,这么写要么报错要么删不掉正确的列。
  • 语法错误拖后腿:rename里的'B1: 'B'引号没闭合,应该是'B1': 'B';ExcelWriter的文件名Book1.xlsx没加单引号,会触发语法错误。
  • 部分操作没生效:比如过滤行的操作是生成新df,没有关联到原对象上。

可行解决方案

方案1:用索引遍历列表,直接更新列表中的元素

这种方法会直接修改原列表里的DataFrame对象,确保后续能拿到修改后的结果:

import pandas as pd

df1 = pd.read_csv('D1.csv')
df2 = pd.read_csv('D2.csv')

P1 = ['x', 'y', 'z', 'w']
T1 = ['t1','t2','t3','t4']

df_list = [df1, df2]
for i in range(len(df_list)):
    df = df_list[i]
    # 新增汇总列
    df['P'] = df[P1].sum(axis=1)
    df['T'] = df[T1].sum(axis=1)
    # 删除指定列(直接传列名列表)
    df = df.drop(P1 + T1, axis=1)
    # 过滤行
    df = df[df['C'].isin([1,2])]
    # 重命名列(修正语法错误)
    df.rename(columns={'A1': 'A', 'B1': 'B', 'C1': 'C'}, inplace=True)
    # 更新列表中的元素
    df_list[i] = df

# 写入Excel(修正文件名引号)
with pd.ExcelWriter('Book1.xlsx', engine='openpyxl', mode='a') as writer:
     df_list[0].to_excel(writer, sheet_name='D1')
     df_list[1].to_excel(writer, sheet_name='D2')

方案2:写一个处理函数,批量处理更清晰

把重复的处理逻辑封装成函数,然后批量处理DataFrame,可读性更强:

import pandas as pd

def process_df(df, P_cols, T_cols):
    # 新增汇总列
    df['P'] = df[P_cols].sum(axis=1)
    df['T'] = df[T_cols].sum(axis=1)
    # 删除列
    df = df.drop(P_cols + T_cols, axis=1)
    # 过滤行
    df = df[df['C'].isin([1,2])]
    # 重命名列
    df.rename(columns={'A1': 'A', 'B1': 'B', 'C1': 'C'}, inplace=True)
    return df

# 读取数据
df1 = pd.read_csv('D1.csv')
df2 = pd.read_csv('D2.csv')

P1 = ['x', 'y', 'z', 'w']
T1 = ['t1','t2','t3','t4']

# 批量处理
df1_processed = process_df(df1, P1, T1)
df2_processed = process_df(df2, P1, T1)

# 写入Excel
with pd.ExcelWriter('Book1.xlsx', engine='openpyxl', mode='a') as writer:
     df1_processed.to_excel(writer, sheet_name='D1')
     df2_processed.to_excel(writer, sheet_name='D2')

额外注意点

  • 如果Book1.xlsx不存在,mode='a'会报错,这时候可以去掉mode='a',默认是新建文件;如果要追加到已有文件,确保文件存在且安装了openpyxl。
  • 过滤行的时候如果原df里没有'C'列会报错,要确保所有DataFrame都有这个列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:51:14