簡體   English   中英

如何用單個 NaN 替換 Pandas 數據框中的多個 NaN 行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM