首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas中,没有NaNs和日期的筛选行是连续的。

在Pandas中,没有NaNs和日期的筛选行是连续的。
EN

Stack Overflow用户
提问于 2021-10-28 11:06:00
回答 2查看 150关注 0票数 1

让我们使用一个日期列是连续的df

代码语言:javascript
复制
          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

我希望对日期为连续的行进行筛选,同时对abc列不进行筛选。

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

代码语言:javascript
复制
         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,因为它的日期并不是连续的与其他:

代码语言:javascript
复制
         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

我怎么能在潘达斯实现这一点?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-28 11:20:48

您可以通过Series.diff测试连续的值,如果不缺少,可以比较1和所有值:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-10-28 11:11:53

溶液

代码语言:javascript
复制
df[df["date"].diff().eq(pd.Timedelta("1 day"))].dropna()

解释

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

代码语言:javascript
复制
df["date"].diff()

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

代码语言:javascript
复制
df["date"].diff().eq(pd.Timedelta("1 day"))

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

最后一步是调用.dropna,它删除包含NaN值的任何行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69752942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档