我有一个时间序列,其中一列主要包含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
答案 0 :(得分:3)
将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
答案 1 :(得分:2)
在x上使用shift方法创建一个新的变量temp。
df['temp'] = df.x.shift(-1)
然后过滤x或temp不为null的行。
df[(~df.x.isnull())|(~df.temp.isnull())]
由于此方法使用内置函数和过滤而不是循环,因此它应该更快。