2015-12-12 170 views
5

我有一個需要合併到一個目錄中的n個文件。他們有列相同數量的,例如,test1.csv內容是:在python中使用熊貓將csv文件附加到一個

test1,test1,test1 
test1,test1,test1 
test1,test1,test1 

同樣,test2.csv內容是:

test2,test2,test2 
test2,test2,test2 
test2,test2,test2 

我想final.csv看起來像這樣:

test1,test1,test1 
test1,test1,test1 
test1,test1,test1 
test2,test2,test2 
test2,test2,test2 
test2,test2,test2 

但是,相反它出來是這樣的:

test file 1,test file 1.1,test file 1.2,test file 2,test file 2.1,test file 2.2 
,,,test file 2,test file 2,test file 2 
,,,test file 2,test file 2,test file 2 
test file 1,test file 1,test file 1,,, 
test file 1,test file 1,test file 1,,, 

有人能幫我弄清楚這裏發生了什麼嗎?我粘貼了以下代碼:

import csv 
import glob 
import pandas as pd 
import numpy as np 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

for f in glob.glob("*.csv"): #for all csv files in pwd 
    df = pd.read_csv(f) #create dataframe for reading current csv 
    all_data = all_data.append(df) #appends current csv to final DF 

all_data.to_csv("final.csv", index=None) 
+0

爲什麼你只用熊貓來創建一個單一的csv? –

+0

我是一個noob,我認爲這是最好的方式來做到這一點。 :/ –

回答

5

我覺得有更多的問題:

  1. 我刪除import csvimport numpy as np,因爲在這個演示,他們沒有使用(但也許他們缺少的,線,因此他們可以導入)
  2. 我創建所有數據幀列表dfs,其中數據幀附加dfs.append(df)。然後我使用函數concat將此列表加入最終數據框。
  3. 功能read_csv我增加了參數header=None,因爲主要問題是read_csv讀取第一行爲header
  4. 在函數to_csv我添加了參數header=None以省略標題。
  5. 我將文件夾test添加到最終目標文件,因爲如果使用功能glob.glob("*.csv"),您應該將輸出文件讀爲輸入文件。

解決方案:

import glob 
import pandas as pd 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

#list of all df 
dfs = [] 
for f in glob.glob("*.csv"): #for all csv files in pwd 
    #add parameters to read_csv 
    df = pd.read_csv(f, header=None) #create dataframe for reading current csv 
    #print df 
    dfs.append(df) #appends current csv to final DF 
all_data = pd.concat(dfs, ignore_index=True) 
print all_data 
#  0  1  2 
#0 test1 test1 test1 
#1 test1 test1 test1 
#2 test1 test1 test1 
#3 test2 test2 test2 
#4 test2 test2 test2 
#5 test2 test2 test2 
all_data.to_csv("test/final.csv", index=None, header=None) 

接下來溶液是類似的。
我將參數header=None添加到read_csvto_csv,並將參數ignore_index=True添加到append

import glob 
import pandas as pd 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

for f in glob.glob("*.csv"): #for all csv files in pwd 
    df = pd.read_csv(f, header=None) #create dataframe for reading current csv 
    all_data = all_data.append(df, ignore_index=True) #appends current csv to final DF 
print all_data 
#  0  1  2 
#0 test1 test1 test1 
#1 test1 test1 test1 
#2 test1 test1 test1 
#3 test2 test2 test2 
#4 test2 test2 test2 
#5 test2 test2 test2 

all_data.to_csv("test/final.csv", index=None, header=None) 
+0

哇謝謝!我今晚會試試這個! –

+1

我覺得'pandas'是數據處理的很好的庫。所以你可以試試它。如果你在Stackoverflow中是新的,你可以檢查[this](http://stackoverflow.com/tour)。 – jezrael

+0

儘管在這方面還有其他關於方法比使用熊貓更有效的解釋,但這種解決方案對我來說最合適。 –

2

您可以concat。讓df1是你的第一個數據幀和df2第二,您可以:

df = pd.concat([df1,df2],ignore_index=True) 

ignore_index是可選的,你可以將其設置爲True,如果你不介意的單dataframes的原始指標。

+1

如果您傳遞「axis = 0」作爲參數,這將起作用。 – hahdawg

+0

@hahdawg感謝您指出。實際上,0是'concat'中'axis'的默認值。 –

+0

謝謝。我會盡力將其實施到我的腳本中。 –

1

pandas是不使用時,所有你想要的是創建一個CSV文件的工具,你可以簡單地每個CSV寫入到一個新的文件,當您去:

import glob 

with open("out.csv","w") as out: 
    for fle in glob.glob("*.csv"): 
     with open(fle) as f: 
      out.writelines(f) 

或者與CSV lib如果你喜歡:

import glob 
import csv 

with open("out.csv", "w") as out: 
    wr = csv.writer(out) 
    for fle in glob.glob("*.csv"): 
     with open(fle) as f: 
      wr.writerows(csv.reader(f)) 

創建的大數據幀只是爲了最終寫入到磁盤是沒有真正意義上的,而且如果你有很多的大文件,可能甚至是不可能的。

+0

明白了。感謝幫助我理解這個概念。數據框對我來說是新的。 –

+0

不用擔心,如果你真的想對數據做一些計算,熊貓是一個很棒的工具,它不是用於將幾個文件連接成一個的工具 –

相關問題