2017-02-19 45 views
2

我想添加一系列的列到一個數據框,其名稱和值是同一行中的其他列的函數。考慮下面的例子,我在其中添加了一列1997年1月(即1997年第一季度),其值是1997年前三個月數據的總和。這很容易完成,但是我想在多年的時間內爲每個季度創建一個新列。如何向其名稱和值是其他列的函數的數據框添加列?

例如,如果我開始與數據框:

enter image description here

我想用下面的數據框結束(1997-XX列包括在內,但他們必須被刪除):

enter image description here

回答

0

使用df.sum()

df['q1'] = df[['1997-01', '1997-02', '1997-03']].sum(axis=1) 

df 
Out[66]: 
      RegionName  State 1997-01 1997-02 1997-03  q1 
0 New   York  NY  NaN  NaN  NaN  0.0 
1 Los  Angeles  CA 155900.0 157000.0 157700.0 470600.0 
2 Chicago   IL 110800.0 111300.0 111700.0  NaN 223000.0 
0

假設我們有以下DF:

In [323]: df 
Out[323]: 
    RegionName State 1997-01 1997-02 1997-03 1997-04 1997-11 
0  New York NY  NaN  NaN  NaN  NaN  NaN 
1 Los Angeles CA  1.0  1.0  1.0  1.0  1.0 
2  Chicago IL  2.0  2.0  2.0  2.0  2.0 

讓我們先來僅提取date列:

In [324]: x = df[df.columns[df.columns.str.contains(r'\d{4}\-\d{2}')]] 

In [325]: x 
Out[325]: 
    1997-01 1997-02 1997-03 1997-04 1997-11 
0  NaN  NaN  NaN  NaN  NaN 
1  1.0  1.0  1.0  1.0  1.0 
2  2.0  2.0  2.0  2.0  2.0 

現在我們可以通過PeriodIndex(..., freq='Q'))

In [326]: new = x.groupby(pd.PeriodIndex(x.columns, freq='Q'), axis=1).sum() 

In [327]: new 
Out[327]: 
    1997Q1 1997Q2 1997Q4 
0  NaN  NaN  NaN 
1  3.0  1.0  1.0 
2  6.0  2.0  2.0 

組最後我們可以加入它原裝DF:

In [328]: df.join(new) 
Out[328]: 
    RegionName State 1997-01 1997-02 1997-03 1997-04 1997-11 1997Q1 1997Q2 1997Q4 
0  New York NY  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
1 Los Angeles CA  1.0  1.0  1.0  1.0  1.0  3.0  1.0  1.0 
2  Chicago IL  2.0  2.0  2.0  2.0  2.0  6.0  2.0  2.0 
相關問題