2016-07-30 17 views
1

我有一個多指標系列(3個指標),看起來像這樣:使用熊貓數據幀從MultiIindex系列添加滯後功能

Week ID_1 ID_2 
3  26  1182   39.0 
       4767   42.0 
       31393   20.0 
       31690   42.0 
       32962   3.0 
.................................... 

我也有一個數據幀df其中包含所有列(及以上)使用對於上述系列中的索引,我想在我的數據框df中創建一個新列,其中包含與系列中的ID_1ID_2Week - 2匹配的值。

例如,對於在具有ID_1 = 26ID_2 = 1182Week = 3數據框的行,我想匹配由ID_1 = 26ID_2 = 1182Week = 1(3-2)指數系列的價值,把它放在該行中新柱。此外,我的系列不一定有要求的數據框,我想在這種情況下,價值只是有0

現在,我試圖做到這一點通過:

[multiindex_series.get((x[1].get('week', 2) - 2, x[1].get('ID_1', 0), x[1].get('ID_2', 0))) for x in df.iterrows()] 

然而,這是非常緩慢和記憶飢餓,我想知道有什麼更好的方法來做到這一點。

FWIW,該系列使用

saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median() 

創建,我願意做它用不同的方式是否存在更好的路徑,創造了我要找的。

回答

3

增加Week 2:

saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median() 
saved_groupby = saved_groupby.reset_index() 
saved_groupby['Week'] = saved_groupby['Week'] + 2 

,然後用df合併saved_groupby

result = pd.merge(df, saved_groupby, on=['Week', 'ID_1', 'ID_2'], how='left') 

這將增加df從2周前的目標位。 爲了使中值(目標)saved_groupby列0時不存在匹配,則使用fillna改變的NaN至0:

result['Median'] = result['Median'].fillna(0) 

例如,

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

df = pd.DataFrame(np.random.randint(5, size=(20,5)), 
        columns=['Week', 'ID_1', 'ID_2', 'Target', 'Foo']) 

saved_groupby = df.groupby(['Week', 'ID_1', 'ID_2'])['Target'].median() 
saved_groupby = saved_groupby.reset_index() 
saved_groupby['Week'] = saved_groupby['Week'] + 2 
saved_groupby = saved_groupby.rename(columns={'Target':'Median'}) 

result = pd.merge(df, saved_groupby, on=['Week', 'ID_1', 'ID_2'], how='left') 
result['Median'] = result['Median'].fillna(0) 
print(result) 

產量

Week ID_1 ID_2 Target Foo Median 
0  3  2  3  4 2  0.0 
1  3  3  0  3 4  0.0 
2  4  3  0  1 2  0.0 
3  3  4  1  1 1  0.0 
4  2  4  2  0 3  2.0 
5  1  0  1  4 4  0.0 
6  2  3  4  0 0  0.0 
7  4  0  0  2 3  0.0 
8  3  4  3  2 2  0.0 
9  2  2  4  0 1  0.0 
10  2  0  4  4 2  0.0 
11  1  1  3  0 0  0.0 
12  0  1  0  2 0  0.0 
13  4  0  4  0 3  4.0 
14  1  2  1  3 1  0.0 
15  3  0  1  3 4  2.0 
16  0  4  2  2 4  0.0 
17  1  1  4  4 2  0.0 
18  4  1  0  3 0  0.0 
19  1  0  1  0 0  0.0 
+0

輝煌,甚至沒有考慮重置指數,謝謝!我認爲,爲了配合我的問題,我應該**在本週添加** 2,不是嗎?否則,數據框將包含我相信的未來幾周的中值目標。 – confused00

+0

對,如果你想用2周前的中值目標來增加原始數據幀,然後使用'saved_groupby ['Week'] = saved_groupby ['Week'] + 2'。 – unutbu