我有一个这样的数据框
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)
答案 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']