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

如何将多DataFrame列表传入自定义Python函数?报错求助

问题解决步骤

核心错误分析

  1. 列表构造错误:你用my_dfs.append([df1, df2])会把包含两个DataFrame的列表作为单个元素添加到my_dfs中,最终my_dfs的结构是[[df1, df2]](二维列表),而非存储单个DataFrame的一维列表。
  2. 函数调用错误:data_cleaning函数是为单个DataFrame设计的,直接传入列表会导致函数尝试调用列表的replace方法,而列表没有这个属性,因此抛出AttributeError。

修正后的代码

步骤1:正确构造DataFrame列表

把原来的my_dfs.append([df1, df2])替换成以下任意一种方式:

# 方式1:直接初始化列表
my_dfs = [df1, df2]

# 方式2:逐个添加元素
my_dfs.append(df1)
my_dfs.append(df2)

步骤2:遍历列表执行清洗操作

修改函数调用部分,用for循环遍历my_dfs中的每个DataFrame,逐个调用清洗函数:

import pandas as pd

my_dfs = []

xl_wb_filepath_df1 = input("Enter the path to your file: ")
xl_wb_filepath_df2 = input("Enter the path to your file: ")

df1 = pd.read_excel(xl_wb_filepath_df1, sheet_name= 'Summary')
df2 = pd.read_excel(xl_wb_filepath_df2, sheet_name= 'Summary')
# 修正列表构造
my_dfs = [df1, df2]

def data_cleaning(df):
    df.replace(regex=r'_95C_XXXX', value='_85C_YYYY', inplace= True)
    df.dropna(axis= 1, how= "all", inplace= True)
    df.rename(columns=df.iloc[0], inplace= True)
    df.drop(df.index[0], inplace= True)
    # 添加errors='ignore'避免列不存在时报错
    df.drop(columns= ['NAME_OTHERNAME_85C_YYYY', 'END'], inplace= True, errors='ignore')
    df.dropna(axis = 0, how= "all", inplace= True)
    df.set_index("USECASE_LIST_85C_YYYY", inplace= True)
    df.index.names = ["SYS_MODS_85C_YYYY"]

# 遍历列表执行清洗
for df in my_dfs:
    data_cleaning(df)

额外优化建议

  • 在df.drop(columns=...)中添加errors='ignore',可以避免因目标列不存在而抛出异常,增强代码鲁棒性。
  • 如果需要返回清洗后的DataFrame列表(而非原地修改),可以修改函数为无inplace=True的操作,返回新的DataFrame,再通过列表推导式生成新列表:
def data_cleaning(df):
    df_clean = df.copy()
    df_clean.replace(regex=r'_95C_XXXX', value='_85C_YYYY')
    df_clean.dropna(axis= 1, how= "all")
    df_clean.rename(columns=df_clean.iloc[0])
    df_clean.drop(df_clean.index[0])
    df_clean.drop(columns= ['NAME_OTHERNAME_85C_YYYY', 'END'], errors='ignore')
    df_clean.dropna(axis = 0, how= "all")
    df_clean.set_index("USECASE_LIST_85C_YYYY")
    df_clean.index.names = ["SYS_MODS_85C_YYYY"]
    return df_clean

# 生成清洗后的新列表
cleaned_dfs = [data_cleaning(df) for df in my_dfs]

内容的提问来源于stack exchange,提问作者andrewliam.dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:36:17