2016-03-16 128 views
2

我試圖將文件列表讀入Python中的Pandas DataFrames列表。但是,下面的代碼不起作用。將文件列表讀入DataFrame列表

files = [file1, file2, file3] 

df1 = pd.DataFrame() 
df2 = pd.DataFrame() 
df3 = pd.DataFrame() 

dfs = [df1, df2, df3] 

# Read in data files 
for file,df in zip(files, dfs): 
    if file_exists(file): 
     with open(file, 'rb') as in_file: 
      df = pd.read_csv(in_file, low_memory=False) 
      print df  #the file is getting read properly 

print df1 #empty 
print df2 #empty 
print df3 #empty 

如何將原始數據框更新,如果我將它們作爲DataFrames列表傳遞給for-loop?

+0

你的目標是要讀這些文件分爲三個話語結構或將它們合併在一起成單個DF? – MaxU

+1

你正在更新迭代器而不是元素是什麼,如果你迭代一個列表,它將是同樣的事情。是否有理由需要先構建空的dfs而不是隻設置'dfs = []',然後遍歷這些文件並執行'dfs.append(pd.read_csv(in_file)'?) – EdChum

+1

當您迭代列表中,你不能直接修改元素,行'df = pd.read_csv(in_file,low_memory = False)實際上並沒有修改列表中的元素,而是修改了元素的副本。它@EdChum :) – spiffman

回答

1

在遍歷它們時,您不是在處理列表元素本身,而是在列表中操作而不是

您需要插入元素(或將它們追加到列表中)。一種可能性是:

files = [file1, file2, file3] 

dfs = [None] * 3 # Just a placeholder 

# Read in data files 
for i, file in enumerate(files): # Enumeration instead of zip 
    if file_exists(file): 
     with open(file, 'rb') as in_file: 
      dfs[i] = pd.read_csv(in_file, low_memory=False) # Setting the list element 
      print dfs[i]  #the file is getting read properly 

這更新列表元素,應該工作。

1

你的代碼似乎過於複雜,你可以這樣做:

files = [file1, file2, file3] 

dfs = [] 

# Read in data files 
for file in files: 
    if file_exists(file): 
     dfs.append(pd.read_csv(file, low_memory=False)) 

您將結束與DFS的列表根據需要

1

試試這個:如果你想

dfs = [pd.read_csv(f, low_memory=False) for f in files] 

檢查文件是否存在:

import os 

dfs = [pd.read_csv(f, low_memory=False) for f in files if os.path.isfile(f)] 

,如果你想對所有這些連接成一個數據幀:

df = pd.concat([pd.read_csv(f, low_memory=False) 
       for f in files if os.path.isfile(f)], 
       ignore_index=True) 
0

您可以嘗試list理解:

files = [file1, file2, file3] 

dfs = [pd.read_csv(x, low_memory=False) for x in files if file_exists(x)]