熊猫:向前填充而不填充尾随的NaN

时间:2018-09-11 17:57:12

标签: python pandas

我有一个数据帧,其中每一列都是不同长度的时间序列。因此,在时间序列中的值之间以及在每个时间序列的末尾都保存一列的值都缺失。我想填充值之间的缺失值,但不填充“尾随” 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

因此它是前向填充的,但是仅当将来有一些非空值要填充时才保留,而尾随为空。

1 个答案:

答案 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]的地方,因为我找不到从下到上方向进行累积操作的更好方法。