根据其他列的条件,组中的Pandas dataframe max

时间:2014-10-09 16:16:18

标签: python pandas dataframe max pandas-groupby

我不确定此问题是否曾被提出过。在pandas数据框中,我有像

这样的数据
    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从B为0,C为2,B为2.5,C为2.5,然后B和C为0,一个重要特性是B和C可能不同但是它们不同将同时转到0。将其视为计数器,当设备关闭时,所有计数器将返回0.上例中的设备为y和z。

同样从第一张表中你也可以看到y分别为0和1分别为B和C,但它们从未回到0但我仍然需要最大值1和1代表B和C.

我可以编写一些python代码来循环并进行必要的转换,但我想知道这是否可能与一些熊猫魔法。

1 个答案:

答案 0 :(得分:1)

这是一种使用矢量化方法的方法,应该非常快。

如果有“重置”字样,请添加值为1的列。通过检查B& C为0。

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

然后,按设备类型分组,并使用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