如何用单个NaN替换熊猫数据框中的多个NaN行

时间:2020-02-12 08:18:27

标签: python pandas dataframe

我有一个时间序列,其中一列主要包含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

2 个答案:

答案 0 :(得分:3)

boolean indexingSeries.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

答案 1 :(得分:2)

在x上使用shift方法创建一个新的变量temp。

df['temp'] = df.x.shift(-1)

然后过滤x或temp不为null的行。

df[(~df.x.isnull())|(~df.temp.isnull())]

由于此方法使用内置函数和过滤而不是循环,因此它应该更快。