如何将多DataFrame列表传入自定义Python函数?报错求助
问题解决步骤
核心错误分析
- 列表构造错误:你用
my_dfs.append([df1, df2])会把包含两个DataFrame的列表作为单个元素添加到my_dfs中,最终my_dfs的结构是[[df1, df2]](二维列表),而非存储单个DataFrame的一维列表。 - 函数调用错误:
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
相关产品推荐
相关产品推荐

