我不确定此问题是否曾被提出过。在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代码来循环并进行必要的转换,但我想知道这是否可能与一些熊猫魔法。
答案 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