2017-10-13 57 views
0

我有兩個這樣dataframes:填充值的從另一列的總和列中指定的時間間隔在熊貓

  df1      df2 
col1  col2 col3  col1  col2 
item1  14  NaN  item1  3 
item1  28  NaN  item2  4 
item1  6  NaN  ... 
item1  16  NaN    
item1  7  NaN    
item1  25  NaN    
item1  11  NaN    
item1  17  NaN    
item1  10  NaN    
item1  22  NaN    
item2  21  NaN    
item2  25  NaN    
item2  24  NaN    
item2  25  NaN    
item2  16  NaN    
item2  15  NaN    
item2  26  NaN    
item2  14  NaN    
item2  16  NaN    
item2  30  NaN    
... 

我需要在數據幀df1填充柱col3用的總和值在df1的列col2中,在數據幀df2中指定的時間間隔內。對於數據幀df1的列col1中的每個唯一值,它是唯一的,並在df2的列col2中指示。但與此同時,如果df1col2列中的值不足,則只能總結那些值。我需要爲df1col1列中的每個唯一值獲得這樣的數量。

結果應該是這樣的:

col1 col2 col3 
item1 14  48 
item1 28  50 
item1  6  29 
item1 16  48 
item1  7  43 
item1 25  53 
item1 11  38 
item1 17  49 
item1 10  32 
item1 22  22 
item2 21  95 
item2 25  90 
item2 24  80 
item2 25  82 
item2 16  71 
item2 15  71 
item2 26  86 
item2 14  60 
item2 16  46 
item2 30  30 
... 

下面是如何計算的item1時的例子:

col1 col2 calculations for col3    
item1 14 (14 + 28 + 6) =48 
item1 28 (28 + 6 + 16) =50 
item1 6 (6 + 16 + 7) =29 
item1 16 (16 + 7 + 25) =48 
item1 7 (7 + 25 + 11) =43 
item1 25 (25 + 11 + 17) =53 
item1 11 (11 + 17 + 10) =38 
item1 17 (17 + 10 + 22) =49 
item1 10 (10 + 22 ) =32 
item1 22 (22   ) =22 

的問題是,有很多獨特的價值觀在df1的列col1和列col2df2中指定的時間間隔可以每次都不同。

我將不勝感激任何幫助!

+1

你嘗試過這麼遠嗎? –

回答

2

Rollingapply

df1['window']=df1.col1.map(df2.set_index('col1').col2) 


df1['col3']=df1.groupby('col1').apply(lambda x : x.col2.sort_index(ascending=False)\ 
.rolling(window=x.window.values[0],min_periods=1).sum()).reset_index(level='col1',drop=True) 


df1 
Out[219]: 
    col1 col2 col3 window 
0 item1 14 48.0  3 
1 item1 28 50.0  3 
2 item1  6 29.0  3 
3 item1 16 48.0  3 
4 item1  7 43.0  3 
5 item1 25 53.0  3 
6 item1 11 38.0  3 
7 item1 17 49.0  3 
8 item1 10 32.0  3 
9 item1 22 22.0  3 
10 item2 21 95.0  4 
11 item2 25 90.0  4 
12 item2 24 80.0  4 
13 item2 25 82.0  4 
14 item2 16 71.0  4 
15 item2 15 71.0  4 
16 item2 26 86.0  4 
17 item2 14 60.0  4 
18 item2 16 46.0  4 
19 item2 30 30.0  4 
+0

@Bharathshetty歡呼LOL〜 – Wen

1

另一個類似的方法與rolling sum, [::-1]

df1['new'] = df1['col1'].map(df2.set_index('col1')['col2']) 
df1['col3'] = df1.groupby(['col1'])['col2','new'].apply(lambda x : x[['col2']][::-1].rolling(x.new.values[0],min_periods=1).sum()[::-1]).values 

輸出:

 
    col1 col2 col3 new 
0 item1 14 48.0 3 
1 item1 28 50.0 3 
2 item1  6 29.0 3 
3 item1 16 48.0 3 
4 item1  7 43.0 3 
5 item1 25 53.0 3 
6 item1 11 38.0 3 
7 item1 17 49.0 3 
8 item1 10 32.0 3 
9 item1 22 22.0 3 
10 item2 21 95.0 4 
11 item2 25 90.0 4 
12 item2 24 80.0 4 
13 item2 25 82.0 4 
14 item2 16 71.0 4 
15 item2 15 71.0 4 
16 item2 26 86.0 4 
17 item2 14 60.0 4 
18 item2 16 46.0 4 
19 item2 30 30.0 4 
相關問題