熊猫如何根据后面的行过滤前面的行

时间:2019-02-15 18:50:59

标签: python pandas

我有一个这样的数据框

Day,Minute,Second,Value
1,1,0,1
1,2,1,2
1,3,1,2
1,2,6,0
1,2,1,1
1,2,5,1
2,0,1,1
2,0,5,2

有时,传感器记录了不正确的值,并再次添加了正确的值。例如,在这里我们应该删除第二行和第三行,因为它们被来自它们之前的时间戳的第四行覆盖。如何过滤掉不必要的“坏”行?对于此示例,预期输出应为:

Day,Minute,Second,Value
1,1,0,1
1,2,1,1
1,2,5,1
2,0,1,1
2,0,5,2

这是迭代解决方案的伪代码(抱歉,没有缩进格式,这是我的第一篇文章)

for row in dataframe:
for previous_row in rows in dataframe before row:
if previous_row > row:
delete previous row

我认为应该有一个向量化的解决方案,尤其是对于第二个循环。我也不想修改我要迭代的内容,但是我不确定除了复制数据框之外还有其他选择。

以下是一些用于示例数据框的入门代码

import pandas as pd
data = [{'Day':1, 'Minute':1, 'Second':0, 'Value':1},
{'Day':1, 'Minute':2, 'Second':1, 'Value':2}, 
{'Day':1, 'Minute':2, 'Second':6, 'Value':2}, 
{'Day':1, 'Minute':3, 'Second':1, 'Value':0},
{'Day':1, 'Minute':2, 'Second':1, 'Value':1},
{'Day':1, 'Minute':2, 'Second':5, 'Value':1}, 
{'Day':2, 'Minute':0, 'Second':1, 'Value':1}, 
{'Day':2, 'Minute':0, 'Second':5, 'Value':2}]

df = pd.DataFrame(data)

1 个答案:

答案 0 :(得分:1)

如果您为Day, Minute, Second的相同组合但有不同的Value有多行,则假设您要保留最后记录的值,并考虑所有先前的值,认为它们是“差的” 。

您可以简单地通过使用drop_duplicates来做到这一点:

df.drop_duplicates(subset=['Day', 'Minute', 'Second'], keep='last')

UPDATE v2:

如果您每天需要保留最后一组['Minute', 'Second']组合,请确定单调递增的Minute组(因为这是二者中较大的时间单位),然后选择包含{{每个max的{​​{1}}的1}}值:

Group_Id

输出:

['Day']