2014-10-09 132 views
0

我不確定以前是否詢問過此問題。在一個熊貓數據幀我有這樣基於其他列上的條件,組中的熊貓數據框最大值

A B C 

1 z 0 0 
2 z 1 1 
3 z 2 2 
4 y 0 0 
5 y 1 1 
6 z 2 2.5 
7 z 0 0 
8 z 1 0.2 
9 z 2 0.8 

數據我想獲得

A B C 

1 z 2 2.5 
2 y 1 1 
3 z 2 0.8 

在上面的例子(從第一表)z的從0變爲對於B和C 2 B和2.5爲C分別在B和C之前爲0。一個重要的屬性是B和C可以不同,但​​它們將同時變爲0。把它看作一個計數器,當設備關閉時,所有的計數器都會返回0.上面例子中的設備是y和z。

從第一張表中也可以看出,對於B和C,y分別從0到1,但是他們從未回到0,但我仍然需要B和C的最大值爲1和1.

我可以寫一些python代碼循環並做必要的轉換,但我想知道這是否可以用一些熊貓魔法。

回答

1

這是一種使用矢量化方法的方法,應該非常快。

添加列具有值1時,有一個計數器的「復位」,通過檢查其中兩個B & C是0

df['new_sample'] = (df[['B','C']] == 0).any(1).astype(int) 

然後,GROUPBY設備類型,以及使用的累積和的new_sample列中,創建一個計數器,每個設備每行代表的試驗次數。

df['sample'] = df.groupby('A')['new_sample'].cumsum() 

最後,您可以按設備和樣本號進行分組並取最大值。

In [85]: df.groupby(['A', 'sample'], as_index=False)[['B','C']].max() 
Out[85]: 
    A sample B C 
0 y  1 1 1.0 
1 z  1 2 2.5 
2 z  2 2 0.8 
相關問題