[英]How to replace multiple NaN rows in pandas dataframe with a single NaN
我有一個時間序列,其中一列主要包含 NaN。 數據框非常大,因此處理所有這些 NaN 正在成為一種負擔。 如果我簡單地刪除所有這些,圖就會被剩余數據點之間的插值完全弄亂。
這是我所擁有的一個簡短示例:
v x
0.0000 0.000000 NaN
0.0002 0.062791 NaN
0.0004 0.125333 NaN
0.0006 0.187381 95.0
0.0008 0.248690 NaN
0.0010 0.309017 NaN
0.0012 0.368125 NaN
0.0014 0.425779 88.0
0.0016 0.481754 85.0
0.0018 0.535827 91.0
0.0020 0.587785 NaN
0.0022 0.637424 NaN
0.0024 0.684547 NaN
0.0026 0.728969 99.0
...
以及我想要實現的目標:
v x
0.0004 0.125333 NaN
0.0006 0.187381 95.0
0.0012 0.368125 NaN
0.0014 0.425779 88.0
0.0016 0.481754 85.0
0.0018 0.535827 91.0
0.0024 0.684547 NaN
0.0026 0.728969 99.0
...
遍歷行不是一種選擇,因為它會變慢,但我想不出任何合理的方法。 有任何想法嗎?
要使用的數據集示例(相當短):
import pandas as pd
import numpy as np
f=50
Tmax = 1
fs= 5000
df = pd.DataFrame(index=np.arange(0, Tmax, 1/fs), data={'x':np.random.randint(0,100, size=int(fs*Tmax))})
df['v'] = np.sin(2*np.pi*f*df.index)
# Most of "x" is NaN
df.loc[df['x']<75, 'x'] = np.NaN
使用boolean indexing
與按Series.shift
ed 和Series.notna
進行比較並通過|
對於按位或:
df = df[df.x.shift(-1).notna() | df.x.notna()]
print (df)
v x
0.0004 0.125333 NaN
0.0006 0.187381 95.0
0.0012 0.368125 NaN
0.0014 0.425779 88.0
0.0016 0.481754 85.0
0.0018 0.535827 91.0
0.0024 0.684547 NaN
0.0026 0.728969 99.0
通過在 x 上使用 shift 方法創建一個新變量 temp。
df['temp'] = df.x.shift(-1)
然后過濾 x 或 temp 不為空的行。
df[(~df.x.isnull())|(~df.temp.isnull())]
由於這種方法使用內置函數和過濾而不是循環,所以它應該更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.