尝试将多个.csv读入单独的数据框列

时间:2016-04-09 14:30:32

标签: python python-3.x

我正在阅读几个.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

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:3)

由于您已经使用了pandas中的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

只需用您自己的预加载数据框替换列表:

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)