在数据框中查找非单调行

时间:2017-06-29 15:09:36

标签: python pandas

我有一个以Datetime为索引的pandas数据帧。该指数通常单调增加,但似乎有几行不遵循这一步。有哪些快速识别这些不寻常的行?

2 个答案:

答案 0 :(得分:0)

"连结"在什么资源方面?如果您希望编程更容易,那么只需通过减去相邻列来生成新帧。零或负值的任何输入都是您的目标。

如果您需要执行速度,请注意仍然需要相邻差异:您可以保存的只是在给定行中查找多个违规的开销。但是,除非您拥有特别宽的数据框,否则您在短路中损失的可能性超过您通过保存的减法获得的损失。另请注意,具有矩阵运算或其他并行性的处理器对整个数据帧来说足够快,检查将花费您大量时间。

答案 1 :(得分:0)

考虑以下演示:

In [156]: df
Out[156]:
                 val
2017-01-01  0.889887
2017-01-02  0.838433
2017-01-03  0.977659
2017-01-04  0.750143
2017-01-05  0.271435
1970-01-01  0.138332    # <---- !!!
2017-01-07  0.673203
2017-01-08  0.497589
1999-01-01  0.592959    # <---- !!!
2017-01-10  0.818760

In [157]: df.loc[df.index.to_series().diff() < pd.to_timedelta('0 seconds')]
Out[157]:
                 val
1970-01-01  0.138332
1999-01-01  0.592959

In [158]: df.index.to_series().diff() < pd.to_timedelta('0 seconds')
Out[158]:
2017-01-01    False
2017-01-02    False
2017-01-03    False
2017-01-04    False
2017-01-05    False
1970-01-01     True
2017-01-07    False
2017-01-08    False
1999-01-01     True
2017-01-10    False
dtype: bool

In [159]: df.index.to_series().diff()
Out[159]:
2017-01-01           NaT
2017-01-02        1 days
2017-01-03        1 days
2017-01-04        1 days
2017-01-05        1 days
1970-01-01   -17171 days
2017-01-07    17173 days
2017-01-08        1 days
1999-01-01    -6582 days
2017-01-10     6584 days
dtype: timedelta64[ns]