对数据帧的字典进行迭代,并将函数应用于每个数据帧



我有一个数据帧字典,数据帧基本上是文件夹中的csv文件。

因此,我想将此函数应用于字典中的每个数据帧:

def transformations(df):
row_1 = list(df.iloc[0])
row_1_upd = list(filter(None,row_1))
row_2 = list(df.iloc[1])
row_2_upd = list(filter(None,row_2))
new_cols = row_1_upd+row_2_upd
list_df_col = list(df.columns)

for i in range(len(list_df_col)):
list_df_col[i]=new_cols[i]

df.columns = list_df_col
df = df.iloc[2:]

return df

我还能够提取存储在字典中的每个数据帧的名称:

filenames = os.listdir(r'C:UsersxxxxPython_ProjectsAnalytic_PBI') # lists all csv files in your directory
def extract_name_files(text): # removes .csv from the name of each file
name_file = text.strip('.csv')
return name_file
names_of_files = list(map(extract_name_files,filenames)) 
print(names_of_files)
['Analytic_2021_Actual_Budget_FTE', 'Analytic_2021_Actual_Budget_MarginDirectCost', 'Analytic_2021_Actual_Budget_OperationalHqOverheadsCost', 'Analytic_2022_Actual_FTE', 'Analytic_2022_Actual_MarginDirectCost', 'Analytic_2022_Actual_OperationalHqOverheadsCost', 'Analytic_2022_F1_U_FTE', 'Analytic_2022_F1_U_MarginDirectCost', 'Analytic_2022_F1_U_OperationalHqOverheadsCost']

所以我想做的是在字典上循环,使用字典dataStorage中的names_of_files调用数据帧的名称,并为每个数据帧应用函数:

for i, df in dataStorage.items():
df = dataStorage[names_of_files[i]]
df = transformations(df)

但我得到了这个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [359], in <cell line: 1>()
1 for i, df in dataStorage.items():
----> 2     df = dataStorage[names_of_files[i]]
3     df = transformations(df)
TypeError: list indices must be integers or slices, not str

我知道如果我像这样直接应用我的功能:

dataStorage["Analytic_2021_Actual_Budget_FTE"] = transformations(dataStorage["Analytic_2021_Actual_Budget_FTE"])

它之所以有效,是因为我进行了测试。

我可能在这里过于复杂了,但我对的了解有限

我认为过于复杂了

for i, df in dataStorage.items():
df = dataStorage[names_of_files[i]]
df = transformations(df)

如果这个循环的目标只是访问df,那么您根本不需要names_of_files。以下内容应该同样有效,因为您可以从for循环的标头中获得df

for i, df in dataStorage.items():
#df = dataStorage[names_of_files[i]]
df = transformations(df)

您看到的错误是,i不是像调用enumerate那样的索引,而是dataStorage字典的键(字符串?(,因此您不能使用它来索引到names_of_files列表中。您可以将print语句放在for循环中,以准确地查看idf是什么。不过你不需要做所有这些工作。

最新更新