首页 > 解决方案 > 过滤没有任何 NaN 的行,并且日期在 Pandas 中是连续的

问题描述

让我们有一个df日期列是连续的:

          date     a   b     c
0    2021-10-1   8.0  10  12.0
1    2021-10-2   NaN  16   NaN
2    2021-10-3   1.0  14   NaN
3    2021-10-4   2.0  15   NaN
4    2021-10-5   3.0  16   5.0
5    2021-10-6   4.0  17   6.0
6    2021-10-7   9.0  22  11.0
7    2021-10-8  10.0  23  12.0
8    2021-10-9  11.0  24  13.0
9   2021-10-10  12.0  25  14.0
10  2021-10-11  13.0  26   NaN
11  2021-10-12   NaN  27   NaN
12  2021-10-13   NaN  28   NaN

我想过滤日期是连续的行,同时NaN对于列没有ab并且c

df.dropna(how='any'),我得到:

         date     a   b     c
0   2021-10-1   8.0  10  12.0
4   2021-10-5   3.0  16   5.0
5   2021-10-6   4.0  17   6.0
6   2021-10-7   9.0  22  11.0
7   2021-10-8  10.0  23  12.0
8   2021-10-9  11.0  24  13.0
9  2021-10-10  12.0  25  14.0

但我希望即使它没有任何第一行也可以删除NaN,因为它的日期与其他日期不连续:

         date     a   b     c
4   2021-10-5   3.0  16   5.0
5   2021-10-6   4.0  17   6.0
6   2021-10-7   9.0  22  11.0
7   2021-10-8  10.0  23  12.0
8   2021-10-9  11.0  24  13.0
9  2021-10-10  12.0  25  14.0

我如何在 Pandas 中实现这一点?谢谢。

标签: python-3.xpandasdataframe

解决方案


解决方案

df[df["date"].diff().eq(pd.Timedelta("1 day"))].dropna()

解释

这将计算 `date1 列中连续元素之间的差异

df["date"].diff()

这会将差异与 1 天进行比较,并产生一系列真/假值

df["date"].diff().eq(pd.Timedelta("1 day"))

我们可以使用它来过滤以删除数据中没有第二天的任何行。

最后一步是调用.dropnawhich 删除任何包含NaN值的行


推荐阅读