2016-04-09 19 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')'和哇'减少(部分(...'非常优雅!:) –

相关问题