2016-04-24 38 views
-1

我有一個數據框(stockData),它有三種不同類型的數據(按日​​期索引)的庫存數據,這些數據是LAST,VOLUME,MKTCAP。從現有的數據框列名創建新的數據幀列

這裏是數據框的頭(stockData)

      BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME BBG.XLON.BTA.S_MKTCAP \ 
date                    
2001-01-02     572    26605510    37494.60 
2001-01-03     560    24715470    36708.00 
2001-01-04     613    52781855    40182.15 
2001-01-05     630    56600152    41296.50 
2001-01-08     633    41014402    41493.15 

      BBG.XLON.VOD.S_LAST BBG.XLON.VOD.S_VOLUME BBG.XLON.VOD.S_MKTCAP 
date                   
2001-01-02     NaN     NaN     NaN 
2001-01-03    225.00    444328736   145216.0020 
2001-01-04    239.00    488568000   154251.6643 
2001-01-05    242.25    237936704   156349.2288 
2001-01-08    227.75    658059776   146990.8642 

有沒有辦法把這些領域之一爲所有股票的創建這個數據的新的一組列有一個新的職位修復(_HOLIDAY)所以我最終:

   BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME BBG.XLON.BTA.S_MKTCAP BBG.XLON.BTA.S_HOLIDAY \ 
date                    
2001-01-02     572    26605510    37494.60     NaN 
2001-01-03     560    24715470    36708.00     NaN 
2001-01-04     613    52781855    40182.15     NaN 
2001-01-05     630    56600152    41296.50     NaN 
2001-01-08     633    41014402    41493.15     NaN 

      BBG.XLON.VOD.S_LAST BBG.XLON.VOD.S_VOLUME BBG.XLON.VOD.S_MKTCAP BBG.XLON.VOD.S_HOLIDAY 
date                   
2001-01-02     NaN     NaN     NaN     NaN 
2001-01-03    225.00    444328736   145216.0020     NaN 
2001-01-04    239.00    488568000   154251.6643     NaN 
2001-01-05    242.25    237936704   156349.2288     NaN 
2001-01-08    227.75    658059776   146990.8642     NaN 

任何援助將不勝感激。

回答

1

是你想要的嗎?

In [56]: newcols = df.columns.str.replace(r'\.S_.*','.S_HOLIDAY').unique().tolist() 

In [57]: newcols 
Out[57]: ['BBG.XLON.BTA.S_HOLIDAY', 'BBG.XLON.VOD.S_HOLIDAY'] 

,那麼你可以很容易地添加新列:

In [65]: for col in newcols: 
    ....:   df[col] = np.nan 
    ....: 

In [66]: df 
Out[66]: 
      BBG.XLON.BTA.S_LAST BBG.XLON.BTA.S_VOLUME BBG.XLON.BTA.S_MKTCAP \ 
2001-01-02     572    26605510    37494.60 
2001-01-03     560    24715470    36708.00 
2001-01-04     613    52781855    40182.15 
2001-01-05     630    56600152    41296.50 
2001-01-08     633    41014402    41493.15 

      BBG.XLON.VOD.S_LAST BBG.XLON.VOD.S_VOLUME BBG.XLON.VOD.S_MKTCAP \ 
2001-01-02     NaN     NaN     NaN 
2001-01-03    225.00   444328736.0   145216.0020 
2001-01-04    239.00   488568000.0   154251.6643 
2001-01-05    242.25   237936704.0   156349.2288 
2001-01-08    227.75   658059776.0   146990.8642 

      BBG.XLON.BTA.S_HOLIDAY BBG.XLON.VOD.S_HOLIDAY 
2001-01-02      NaN      NaN 
2001-01-03      NaN      NaN 
2001-01-04      NaN      NaN 
2001-01-05      NaN      NaN 
2001-01-08      NaN      NaN 

如果列的順序是對你很重要,你可以重新排序是這樣的:

df = df[ordered_column_list] 
0

您可以使用DataFrame.columns.values獲得列名,然後剝離子後,包括最後的點(。):

names=[s[:s.rfind('.')] for s in df.columns.values] 

在這裏,我假設你的數據框被稱爲df。 這將導致重複的名稱(對於.S_LAST,.S_VOLUME.S_MKTCAP)。現在你可以使用numpy.unique刪除重複:

import numpy as np 
uNames=np.unique(names) 

現在您可以添加新列<name>.S_HOLIDAY分配NaN值:

for n in uNames: 
    df[n+'.S_HOLIDAY']=np.NaN 
相關問題