2016-04-09 57 views
1

我正在讀取幾個.csv文件(每個文件都是第一列中的日期(我想索引)的時間序列,以及時間序列在第二列中我可以讀取數據,但是當我希望每個文件都有自己的按日期索引的列時,它都會附加到數據框中的同一列上:試圖將多個.csv讀取到單獨的數據幀列中

因此,例如,如果我有3個文件三個以上的現實)

csv1 
1/1/2016,1.1 
2/1/2016,1.2 
3/1/2016,1.6 

csv2 
1/1/2016,4.6 
2/1/2016,31.2 
3/1/2016,1.8 

csv3 
2/1/2016,3.2 
3/1/2016,5.8 

目前我回:

0  1 
1/1/2016 1.1 
2/1/2016 1.2 
3/1/2016 1.6 
1/1/2016 4.6 
2/1/2016 31.2 
3/1/2016 1.8 
2/1/2016 3.2 
3/1/2016 5.8 

當我想回:

0  1 2 3 
1/1/2016 1.1 4.6 null 
2/1/2016 1.2 31.2 3.2 
3/1/2016 1.6 1.8 5.8 

我此刻的代碼如下所示:

def getData(rawDataPath): 
    big_frame = pd.DataFrame() 
    path = rawDataPath 
    allfiles = glob.glob(os.path.join(path,"*.csv")) 


    np_array_list = [] 
    for file_ in allfiles: 
     df = pd.read_csv(file_,index_col=None, header=0) 
     np_array_list.append(df.as_matrix()) 

    comb_np_array = np.vstack(np_array_list) 

    big_frame = big_frame.append(pd.DataFrame(comb_np_array)) 

    return big_frame 

任何幫助將非常感激。

感謝

回答

3

既然你已經使用DataFrame從大熊貓,還不如用pandas' join/merging functionality

In [21]: csv1 = io.StringIO("""1/1/2016,1.1 
2/1/2016,1.2 
3/1/2016,1.6""") 

In [22]: csv2 = io.StringIO("""1/1/2016,4.6 
2/1/2016,31.2 
3/1/2016,1.8""") 

In [23]: csv3 = io.StringIO("""2/1/2016,3.2 
3/1/2016,5.8""") 

In [24]: df1 = pd.read_csv(csv1, header=None) 

In [25]: df2 = pd.read_csv(csv2, header=None) 

In [26]: df3 = pd.read_csv(csv3, header=None) 

In [27]: pd.merge(pd.merge(df1, df2, on=0, how='outer'), df3, on=0, how='outer') 
Out[27]: 
      0 1_x 1_y 1 
0 1/1/2016 1.1 4.6 NaN 
1 2/1/2016 1.2 31.2 3.2 
2 3/1/2016 1.6 1.8 5.8 

的例子使用how='outer',這意味着一個完整的外部聯接。如果您的數據可能缺少文件間的密鑰,則選擇該選項。如果情況並非如此,請考慮其他適合您的策略。

爲了減少以健全的方式例如,您可以所有的文件做:

In [30]: from functools import partial, reduce 

In [31]: reduce(partial(pd.merge, on=0, how='outer'), [df1, df2, df3]) 
Out[31]: 
      0 1_x 1_y 1 
0 1/1/2016 1.1 4.6 NaN 
1 2/1/2016 1.2 31.2 3.2 
2 3/1/2016 1.6 1.8 5.8 

只是用自己的預載dataframes更換名單:

def getData(rawDataPath): 
    path = rawDataPath 
    allfiles = glob.glob(os.path.join(path, "*.csv")) 
    dataframes = (pd.read_csv(fname, header=None, names=['date', fname]) 
        for fname in allfiles) 
    return reduce(partial(pd.merge, on='date', how='outer'), dataframes) 
+0

由於這是偉大的!有沒有辦法將.csv文件名稱添加爲列標題? – Stacey

+0

嗯我想你可以修改列名至少通過分配'dframe.columns = ['日期','csv1','csv2','csv3']'左右,或命名您的列創建幀時:'pd.read_csv(csv1,names = ['date','csv1'],header = None)'。這樣就不需要爲普通列加後綴,並且合併後的結果也不會有問題。 –

+0

'pd.merge(df1,df2,...)'的替代(更漂亮)語法是'df1.merge(df2,on = 0,how ='outer')。merge(df3,on = 0,how ='outer')'和哇'減少(部分(...'非常優雅!:) –

相關問題