2016-12-01 110 views
1

我有以下多索引數據幀:大熊貓:GROUPBY只有當條件滿足

 m  dist 

a a 2  5 
    b 3  8 
    c 4  12 
    d 2  3 
b a 2  5 
    b 3  8 
    c 4  14 
    d 2  27 

我要計算一個新列S的基於算法。例如,對於(a,a),算法如下:

選擇具有相同級別0索引的所有其他行: - >(a,a),(a,b),(a,c )中,(a,d)

從該選擇:選擇具有DIST < =自己DIST行 - >(A,A)和(a,d)

獲得的第m列的總和的選擇 - > 2 + 2 = 4

這將導致以下數據幀:

 m  dist s 

a a 2  5  4 
    b 3  8  7 
    c 4  12 11 
    d 2  3  2 
b a 2  5  2 
    b 3  8  5 
    c 4  14 9 
    d 2  27 11 

通過循環遍歷行,爲每行創建一個新的數據框,選擇具有正確dist的行並執行groupby,這將很容易。但對於我目前的數據集來說,這太慢了。這可以通過一些很好的groupby/lambda魔法來實現嗎?

回答

3

您可以按dist數據幀,然後在列mcumsum

df['s'] = df.sort_values('dist').groupby(level=0).m.cumsum() 

enter image description here

這假設有在dist列沒有重複,如果有,做第s列進一步轉換,按dist分組,第一級索引應該滿足:

df['s'] = df.groupby([df.index.get_level_values(0), 'dist']).s.transform('max')