让我们使用一个日期列是连续的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我希望对日期为连续的行进行筛选,同时对a、b和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我怎么能在潘达斯实现这一点?谢谢。
发布于 2021-10-28 11:20:48
您可以通过Series.diff测试连续的值,如果不缺少,可以比较1和所有值:
df["date"] = pd.to_datetime(df["date"])
df = df[df["date"].diff().dt.days.eq(1) & df.notna().all(axis=1)]
print (df)
date a b c
4 2021-10-05 3.0 16 5.0
5 2021-10-06 4.0 17 6.0
6 2021-10-07 9.0 22 11.0
7 2021-10-08 10.0 23 12.0
8 2021-10-09 11.0 24 13.0
9 2021-10-10 12.0 25 14.0如果有DatetimeIndex
df["date"] = pd.to_datetime(df["date"])
df = df.set_index('date')
df = df[df.index.to_series().diff().dt.days.eq(1) & df.notna().all(axis=1)]
print (df)
a b c
date
2021-10-05 3.0 16 5.0
2021-10-06 4.0 17 6.0
2021-10-07 9.0 22 11.0
2021-10-08 10.0 23 12.0
2021-10-09 11.0 24 13.0
2021-10-10 12.0 25 14.0发布于 2021-10-28 11:11:53
溶液
df[df["date"].diff().eq(pd.Timedelta("1 day"))].dropna()解释
这将计算`date1列中的连续元素之间的差异。
df["date"].diff()这会将差异与1天进行比较,并生成一系列的真假值。
df["date"].diff().eq(pd.Timedelta("1 day"))我们可以使用它来过滤数据中没有第二天的任何行。
最后一步是调用.dropna,它删除包含NaN值的任何行。
https://stackoverflow.com/questions/69752942
复制相似问题