2014-07-20 273 views
1

这是一个多部分问题。我似乎无法将所有的东西结合在一起。我们的目标是创建一个数据框(使用多指标猜测),我可以访问如下:熊猫 - 合并多个数据帧

ticker = 'GOLD' 
date = pd.to_datetime('1978/03/31') 
current_bar = df.ix[ticker].ix[date] 

我可以再只说:current_bar.Last?

无论如何,这里是文件,以及如何加载它们。

In [108]: df = pd.read_csv('GOLD.csv', parse_dates='Date', index_col='Date') 
In [109]: df 
Out[109]: 
      Exp  Last  Volume 
Date 
1978-03-30 198002 995.6 54 
1978-03-31 198002 999.5 78 

In [110]: df2 = pd.read_csv('SPX.csv', parse_dates='Date', index_col='Date') 
In [111]: df2 
Out[111]: 
      Exp  Last  Volume 
Date 
1978-03-30 198003 215.5 25 
1978-03-31 198003 214.1 99 

理想情况下,我希望它看起来像这样(我认为):

ticker  GOLD       SPX 
values  Exp  Last  Volume  Exp  Last  Volume 
Date 
1978-03-30 198002 995.6 54   198003 215.5 25 
1978-03-31 198002 999.5 78   198003 214.1 99 
  1. 我想我的问题是:
    • 如何让我这个层次的(实际数据每个文件有20 +相同的列)
    • 然后我如何组合文件(我有大约100个需要全部进入1个DataFrame)
    • 我的假设是正确的,我可以然后做:current_bar.Last获取值?

非常感谢。

回答

4

可以使用pd.concat连接连接 DataFrames。 (连接将数据帧混合在一起,而合并基于公共索引或列连接数据帧)。当您提供keys参数,你会得到一个等级指数:

import pandas as pd 
df = pd.read_csv('GOLD.csv', parse_dates='Date', index_col='Date', sep='\s+') 
df2 = pd.read_csv('SPX.csv', parse_dates='Date', index_col='Date', sep='\s+') 
result = pd.concat([df, df2], keys=['GOLD', 'SPX'], names=['ticker']).unstack('ticker') 
result = result.reorder_levels([1, 0], axis=1).sortlevel(level=0, axis=1) 
print(result) 

产生

ticker  GOLD     SPX    
       Exp Last Volume  Exp Last Volume 
Date              
1978-03-30 198002 995.6  54 198003 215.5  25 
1978-03-31 198002 999.5  78 198003 214.1  99 

result['Last']产生数据帧:

In [147]: result['Last'] 
Out[147]: 
ticker  GOLD SPX 
Date      
1978-03-30 995.6 215.5 
1978-03-31 999.5 214.1 

我建议避免语法result.Last,因为它太接近result.last,它返回一个DataFrame方法。


要处理更多的文件,你可以使用这样的代码:

import pandas as pd 
dfs = list() 
for filename in filenames: 
    df = pd.read_csv(filename, parse_dates='Date', index_col='Date') 
    # compute moving_mean 
    dfs.append(df) 

keys = [filename[:-4] for filename in filenames] 
result = pd.concat(dfs, keys=keys, names=['ticker']).unstack('ticker') 

注意,这确实需要足够的内存来保存在内存加上足够的内存来容纳result所有DataFrames的列表。

+0

明白了。如果我想添加另一个df到'结果'(即'NDX'),该怎么办?如果结果已经有2个,我会用什么键? (我只需要为100个文件执行此操作,因此需要一种迭代的方式。谢谢 – trubby317

+0

“pd.concat”的第一个参数可以是100个DataFrame的列表,而'keys'可以是100个ticker的列表例如,连接3个DataFrames:'result = pd.concat([df,df2,df3],keys = ['GOLD','SPX','NDX'],names = ['ticker'])。 ('ticker')' – unutbu

+0

有没有办法做这样的事情:result = pd.concat([result,df3],keys = [result.keys,'NDX'],names = ['ticker']) .unstack( '股票')? – trubby317