使用循环创建多个数据框

Bob*_*rer 5 dictionary for-loop python-3.x pandas

这无疑反映了我的知识匮乏,但我在网上找不到任何帮助。我对编程很陌生。我想加载 6 个 csv,并对它们做一些操作,然后再将它们合并。以下代码迭代每个文件,但仅创建一个名为df.

files = ('data1.csv', 'data2.csv', 'data3.csv', 'data4.csv', 'data5.csv', 'data6.csv')
dfs = ('df1', 'df2', 'df3', 'df4', 'df5', 'df6')
for df, file in zip(dfs, files):
    df = pd.read_csv(file)
    print(df.shape)
    print(df.dtypes)
    print(list(df))
Run Code Online (Sandbox Code Playgroud)

Kei*_*owd 3

我认为您认为您的代码正在做一些实际上并没有做的事情。

具体来说,这一行:df = pd.read_csv(file)

您可能会认为,在循环的每次迭代中,for都会执行并修改该行,将其df替换为 中的字符串dfsfile替换为 中的文件名files。虽然后者是正确的,但前者则不然。

循环中的每次迭代for都会读取 csv 文件并将其存储在变量中,df从而有效地覆盖在上一个循环中读入的 csv 文件for。换句话说,循环df中的for内容不会被替换为您在dfs.

这里的关键要点是,在执行代码时,字符串(例如'df1''df2'、 等)不能被替换并用作变量名。

实现所需结果的一种方法是将读取的每个 csv 文件存储pd.read_csv()在字典中,其中键是数据帧的名称(例如,'df1''df2'等),值是 . 返回的数据帧pd.read_csv()

list_of_dfs = {}
for df, file in zip(dfs, files):
    list_of_dfs[df] = pd.read_csv(file)
    print(list_of_dfs[df].shape)
    print(list_of_dfs[df].dtypes)
    print(list(list_of_dfs[df]))
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样引用每个数据框:

print(list_of_dfs['df1'])
print(list_of_dfs['df2'])
Run Code Online (Sandbox Code Playgroud)

您可以在这里了解有关词典的更多信息:

https://docs.python.org/3.6/tutorial/datastructs.html#dictionaries