讓我們有一個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為列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
我怎么能在 Pandas 中做到這一點?謝謝。
uj5u.com熱心網友回復:
解決方案
df[df["date"].diff().eq(pd.Timedelta("1 day"))].dropna()
解釋
這將計算 `date1 列中連續元素之間的差異
df["date"].diff()
這將差異與 1 天進行比較,并產生一系列 True/False 值
df["date"].diff().eq(pd.Timedelta("1 day"))
我們可以使用它來過濾以洗掉資料中沒有第二天的任何行。
最后一步是呼叫.dropnawhich 洗掉包含NaN值的任何行
uj5u.com熱心網友回復:
您可以通過 測驗連續值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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/340117.html
