[英]Drop nan rows in pandas that are not in the middle
我有一個按時間索引的熊貓數據框,
例如:
Time Value
2010-01-01 nan
2010-01-02 nan
2010-01-03 3
2010-01-04 4
2010-01-05 5
2010-01-06 3
2010-01-07 nan
2010-01-08 nan
2010-01-09 3
2010-01-10 3
2010-01-11 4
2010-01-12 5
2010-01-13 3
2010-01-14 nan
2010-01-15 nan
在此示例中,我想刪除前兩行和后兩行。 但是中間沒有nan的行。 有沒有辦法做到這一點?
您可以使用第一個有效值和最后一個有效值的索引來過濾數據框:
df.loc[df.Value.first_valid_index(): df.Value.last_valid_index()]
結果:
Value
Time
2010-01-03 3.0
2010-01-04 4.0
2010-01-05 5.0
2010-01-06 3.0
2010-01-07 NaN
2010-01-08 NaN
2010-01-09 3.0
2010-01-10 3.0
2010-01-11 4.0
2010-01-12 5.0
2010-01-13 3.0
假設data
是您的數據框:
a, b = data.dropna().index[[0, -1]]
您也可以考慮選擇特定的列,例如使用data['Value']
而不是data
。
這樣,您將獲得不包含NaN的開始索引和結束索引。 然后,您只需要獲取該切片(請謹慎添加最后一行):
data[a:b+1]
結果:
Time Value
2010-01-03 3
2010-01-04 4
2010-01-05 5
2010-01-06 3
2010-01-07 nan
2010-01-08 nan
2010-01-09 3
2010-01-10 3
2010-01-11 4
2010-01-12 5
2010-01-13 3
遵循@unutbu技巧使用loc
單行解決方案:
data.loc[slice(*data.dropna().index[[0, -1]])]
使用bfill
和ffill
df[df.Value.ffill().notnull()&df.Value.bfill().notnull()]
Out[464]:
Time Value
2 2010-01-03 3.0
3 2010-01-04 4.0
4 2010-01-05 5.0
5 2010-01-06 3.0
6 2010-01-07 NaN
7 2010-01-08 NaN
8 2010-01-09 3.0
9 2010-01-10 3.0
10 2010-01-11 4.0
11 2010-01-12 5.0
12 2010-01-13 3.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.