繁体   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