求助: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
相关产品推荐
相关产品推荐

