2014-10-09 93 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 
相关问题