2017-06-20 48 views
1

我有一個數據框如下,只是一個例子。python2.7 dataframe:從已有的列值中添加新列

date  y  w diff 
2010-1-1 3  1 3 
2010-1-2 4  1 4 
2010-1-3 5  1 2 
2010-1-4 6  2 5 
2010-1-5 7  2 6 
2010-1-6 8  2 5 
2010-1-7 9  3 2 
2010-1-8 10 4 4 
2010-1-9 11 5 5 
2010-1-10 12 6 6 
2010-1-11 13 5 6 

現在比如我是數據框的指數,我要爲數據幀添加新列,有三個新的列名是一樣,P1,P2,P3,但價值是前兩次的價值日期。當然,前兩行值p1,p2是Nan。從3-5行開始,p1,p2的值都是3,4,而p3的值是前兩行的最後一個diff的值,我的意思是3-5行的p3的值都是4.我使用五行爲一個時期。我指的是8-10行,P1,P2的值,P3是8,9,2,新的數據框類似如下:

date  y  w diff p1 p2 p3 
2010-1-1 3  1 3 Nan Nan Nan 
2010-1-2 4  1 4 Nan Nan Nan 
2010-1-3 5  1 2 3 4 4 
2010-1-4 6  2 5 3 4 4 
2010-1-5 7  2 6 3 4 4 
2010-1-6 8  2 5 Nan Nan Nan 
2010-1-7 9  3 2 Nan Nan Nan 
2010-1-8 10 4 4 8 9 2 
2010-1-9 11 5 5 8 9 2 
2010-1-10 12 6 6 8 9 2 
2010-1-11 13 5 6 Nan Nan Nan 

如果有什麼你不明白我的問題,請評論它。謝謝!

回答

1

你可以要求使用numpy的陣列groupbyarange和地板司自定義函數與shift創建array g,然後設置值。最後添加到原來由join

df['date'] = pd.to_datetime(df['date']) 
g = np.arange(len(df.index)) // 5 

def f(x): 
    x = x.shift(2) 
    a = x.values 
    if a.shape[0] > 3: 
     a[3,1] = a[3, 0] 
     a[3,0] = a[2, 0] 
     a[2] = a[3] 
     a[4] = a[3] 
    return pd.DataFrame(a, index=x.index, columns=['p1','p2','p3']) 


df1 = df.groupby(g)['y','w','diff'].apply(f) 
print (df1) 
    p1 p2 p3 
0 NaN NaN NaN 
1 NaN NaN NaN 
2 3.0 4.0 4.0 
3 3.0 4.0 4.0 
4 3.0 4.0 4.0 
5 NaN NaN NaN 
6 NaN NaN NaN 
7 8.0 9.0 2.0 
8 8.0 9.0 2.0 
9 8.0 9.0 2.0 
10 NaN NaN NaN 

df2 = df.join(df1) 
print (df2) 
     date y w diff p1 p2 p3 
0 2010-01-01 3 1  3 NaN NaN NaN 
1 2010-01-02 4 1  4 NaN NaN NaN 
2 2010-01-03 5 1  2 3.0 4.0 4.0 
3 2010-01-04 6 2  5 3.0 4.0 4.0 
4 2010-01-05 7 2  6 3.0 4.0 4.0 
5 2010-01-06 8 2  5 NaN NaN NaN 
6 2010-01-07 9 3  2 NaN NaN NaN 
7 2010-01-08 10 4  4 8.0 9.0 2.0 
8 2010-01-09 11 5  5 8.0 9.0 2.0 
9 2010-01-10 12 6  6 8.0 9.0 2.0 
10 2010-01-11 13 5  6 NaN NaN NaN 
+0

感謝@jezrael,還有另外一個問題,你能不能幫我解決it.https://stackoverflow.com/questions/44752876/python2-pandas - 如何對合並-A-部分的-另一個非數據幀到一個非數據幀 – tktktk0711

相關問題