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