2016-06-09 81 views
-1

我有一個熊貓數據框。我想在其他列上有條件地「滯後」一列。通常在下面,我想基於y先前的「真實」價值滯後gdp。python:在一列上有條件地移動熊貓數據框的列向上移動

通常第一條目將是0,因爲我們正在尋找對於y = 0。

第二條目將是2,因爲我們正在尋找對於y = 1

第三項將是零,因爲我們正在尋找Y = 3

等等

df = 
     y gdp cap 
    0 1 2 5 
    1 2 3 9 
    2 4 7 2 
    3 5 4 7 
    4 6 7 7 

df_lag = 
    y gdp cap y_prev gdp_lag 
0 1 2 5 0  0 
1 2 3 9 1  2 
2 4 7 2 3  0 
3 5 4 7 4  7 
4 6 7 7 5  4 

有沒有什麼簡單的方法來做到這一點?

+2

告訴我們你已經嘗試了什麼,哪些不起作用。請閱讀http://stackoverflow.com/help/how-to-ask –

+0

答案是否有效? – IanS

回答

1

你不需要shift方法,你可以簡單地做一個查找。我做y一系列簡單的指標,並使用.loc訪問值:

df['y_prev'] = df['y'] - 1 
df[['y', 'gdp']].set_index('y', drop=True).loc[df['y_prev'] 

輸出:

gdp 
y  
0 NaN 
1 2.0 
3 NaN 
4 7.0 
5 4.0 

爲了將這些值分配給一個新列,你需要擺脫的索引(與.values)的:

df['gdp_lag'] = df[['y', 'gdp']].set_index('y', drop=True).loc[df['y_prev']].values 
0

mapsqueeze另一種解決方案:

df['y_prev'] = df['y'] - 1 

s = (df[['y', 'gdp']].set_index('y').squeeze()) 
#another solution with iloc 
#s = (df[['y', 'gdp']].set_index('y').iloc[0]) 
print (s) 
y 
1 2 
2 3 
4 7 
5 4 
6 7 
Name: gdp, dtype: int64 
df['gdp_lag'] = df['y_prev'].map(s).fillna(0) 
print (df) 
    y gdp cap y_prev gdp_lag 
0 1 2 5  0  0.0 
1 2 3 9  1  2.0 
2 4 7 2  3  0.0 
3 5 4 7  4  7.0 
4 6 7 7  5  4.0 
+0

「squeeze」究竟做了什麼?您提供的鏈接不是非常明確:) – IanS

+1

我今天才知道 - 它創建了具有1列'DataFrame'的'Series' - 我發現[this](http://stackoverflow.com/q/19599578/2901002)。 – jezrael