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 分别从 B 和 C 的 0 变为 B 的 2 和 C 的 2.5,然后 B 和 C 变为 0。一个重要的属性是 B 和 C 可以不同,但​​是它们会去0 同时。把它想象成一个计数器,当设备关闭时,你的所有计数器都会回到 0。上面例子中的设备是 y 和 z。

同样从第一个表中,您还可以看到 B 和 C 的 y 分别从 0 变为 1,但是它们从未回到 0,但我仍然需要 B 和 C 的最大值,即 1 和 1。

我可以编写一些 python 代码来循环并进行必要的转换,但我想知道这是否可以通过一些 pandas 魔法来实现。

4

1 回答 1

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
于 2014-10-09T20:45:45.947 回答