使用循环创建多个数据帧

时间:2018-02-20 14:52:58

标签: python-3.x pandas dictionary for-loop

这无疑反映了我缺乏知识,但我无法在网上找到任何帮助。我是编程新手。我想加载6个csvs并为它们做一些事情,然后再将它们组合起来。以下代码遍历每个文件,但只创建一个名为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))

3 个答案:

答案 0 :(得分:1)

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

具体来说,这一行:onError

您可能会认为,在df = pd.read_csv(file)循环的每次迭代中,正在执行和修改此行,for替换为df中的字符串,dfs被替换文件名为file。虽然后者是真的,但前者不是。

通过files循环的每次迭代都会读取csv文件并将其存储在变量for中,从而有效地覆盖在前一个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]))

您可以在此处详细了解字典:

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

答案 1 :(得分:0)

字典也可以存储它们

import pandas as pd
from pprint import pprint

files = ('doms_stats201610051.csv', 'doms_stats201610052.csv')
dfsdic = {}
dfs = ('df1', 'df2')
for df, file in zip(dfs, files):
  dfsdic[df] = pd.read_csv(file)
  print(dfsdic[df].shape)
  print(dfsdic[df].dtypes)
  print(list(dfsdic[df]))

print(dfsdic['df1'].shape)
print(dfsdic['df2'].shape)

答案 2 :(得分:0)

使用字典存储DataFrame并按名称访问它们

files = ('data1.csv', 'data2.csv', 'data3.csv', 'data4.csv', 'data5.csv', 'data6.csv')
dfs_names = ('df1', 'df2', 'df3', 'df4', 'df5', 'df6')
dfs ={}
for dfn,file in zip(dfs_names, files):
    dfs[dfn] = pd.read_csv(file)
    print(dfs[dfn].shape)
    print(dfs[dfn].dtypes)
print(dfs['df3'])

使用list存储DataFrame并通过索引访问它们

files = ('data1.csv', 'data2.csv', 'data3.csv', 'data4.csv', 'data5.csv', 'data6.csv')
dfs = []
for file in  files:
    dfs.append( pd.read_csv(file))
    print(dfs[len(dfs)-1].shape)
    print(dfs[len(dfs)-1].dtypes)
print (dfs[2])

不要存储中间数据框架,只需处理它们并添加到生成的DataFrame中。

files = ('data1.csv', 'data2.csv', 'data3.csv', 'data4.csv', 'data5.csv', 'data6.csv')
df = pd.DataFrame()
for file in  files:
    df_n =  pd.read_csv(file)
    print(df_n.shape)
    print(df_n.dtypes)
    # do you want to do
    df = df.append(df_n)
print (df)

如果您将以不同方式处理它们,那么您不需要通用结构来存储它们。这样做只是独立的。

df = pd.DataFrame()
def do_general_stuff(d): #here we do common things with DataFrame
    print(d.shape,d.dtypes)

df1 = pd.read_csv("data1.csv")
# do you want to with df1

do_general_stuff(df1)
df = df.append(df1)
del df1

df2 = pd.read_csv("data2.csv")
# do you want to with df2

do_general_stuff(df2)
df = df.append(df2)
del df2

df3 = pd.read_csv("data3.csv")
# do you want to with df3

do_general_stuff(df3)
df = df.append(df3)
del df3

# ... and so on

一种令人讨厌的方式,但不要问它是如何工作的:)

from collections import namedtuple
files = ['data1.csv', 'data2.csv', 'data3.csv', 'data4.csv', 'data5.csv', 'data6.csv']

df = namedtuple('Cdfs',
                ['df1', 'df2', 'df3', 'df4', 'df5', 'df6']
               )(*[pd.read_csv(file) for file in files])

for df_n in df._fields:
    print(getattr(df, df_n).shape,getattr(df, df_n).dtypes)

print(df.df3)