我有一个数据帧,其中每一列都是不同长度的时间序列。因此,在时间序列中的值之间以及在每个时间序列的末尾都保存一列的值都缺失。我想填充值之间的缺失值,但不填充“尾随” NaNs
使用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
因此它是前向填充的,但是仅当将来有一些非空值要填充时才保留,而尾随为空。
答案 0 :(得分:5)
一种方法是填充,使所有在最后一个非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]
的地方,因为我找不到从下到上方向进行累积操作的更好方法。