我有一个数据框,其中每一列都是不同长度的时间序列。因此,时间序列中的值之间以及每个时间序列末尾保存一列时都存在缺失值。我想填充值之间的缺失值,但不填充“尾随”NaN
使用 df = df.fillna(method='ffill') 让我完成了大部分工作,但填充了尾随的 NaN,这是我不想要的,因为数据结束的地方实际上对我的分析很重要。
编辑:
我想把这个:
ERICB SS Equity DCI US Equity FLEX US Equity
date
2008-02-14 8.026 NaN NaN
2008-02-18 NaN NaN 1.472
2008-02-19 8.074 NaN NaN
2008-02-22 NaN NaN 1.532
2008-02-25 8.062 NaN NaN
2008-03-03 8.100 NaN NaN
2008-03-06 8.100 NaN 1.955
2008-03-07 8.100 NaN NaN
2010-12-30 5.431 NaN NaN
2010-12-31 5.422 NaN NaN
2011-01-03 5.422 NaN NaN
2011-01-04 5.373 NaN NaN
进入这个:
ERICB SS Equity DCI US Equity FLEX US Equity
date
2008-02-14 8.026 NaN NaN
2008-02-18 8.026 NaN 1.472
2008-02-19 8.074 NaN 1.472
2008-02-22 8.074 NaN 1.532
2008-02-25 8.062 NaN 1.532
2008-03-03 8.100 NaN 1.532
2008-03-06 8.100 NaN 1.955
2008-03-07 8.100 NaN NaN
2010-12-30 5.431 NaN NaN
2010-12-31 5.422 NaN NaN
2011-01-03 5.422 NaN NaN
2011-01-04 5.373 NaN NaN
所以它是向前填充的,但只有当将来有一些非空值要填充时,才会留下尾随的空值。
请您参考如下方法:
一种方法是 bfill,它使最后一个非 NaN 值之前的所有内容都为非 NaN,然后使用 where 选择 ffill() 结果:
In [45]: df.ffill().where(df.bfill().notnull())
Out[45]:
date ERICB SS Equity DCI US Equity FLEX US Equity
0 2008-02-14 8.026 NaN NaN
1 2008-02-18 8.026 NaN 1.472
2 2008-02-19 8.074 NaN 1.472
3 2008-02-22 8.074 NaN 1.532
4 2008-02-25 8.062 NaN 1.532
5 2008-03-03 8.100 NaN 1.532
6 2008-03-06 8.100 NaN 1.955
7 2008-03-07 8.100 NaN NaN
8 2010-12-30 5.431 NaN NaN
9 2010-12-31 5.422 NaN NaN
10 2011-01-03 5.422 NaN NaN
11 2011-01-04 5.373 NaN NaN
另一种方法是直接为直到并包括最后一个有效值的所有值制作一个包含 True 的掩码:
df.ffill().where(df.notnull().iloc[::-1].cummax().iloc[::-1])
.iloc[::-1] 是必需的,因为我找不到更好的方法在自下而上的方向上进行累积操作。
