2014-07-20 272 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