【问题标题】:Pandas: Forward Fill without Filling trailing NaNsPandas:前向填充而不填充尾随 NaN
【发布时间】:2019-04-30 04:35:50
【问题描述】:

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

所以它是前向填充的,但只有当将来有一些非空值要填充时,才会留下尾随的空值。

【问题讨论】:

  • 您想创建一个简单的数据框并向我们展示您的预期输出吗?
  • df = df.replace(np.nan, '', regex=True)
  • 也可以试试 df = df.bfill().ffill()

标签: python pandas


【解决方案1】:

一种方法是 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] 的地方,因为我找不到更好的方法来在自下而上的方向上进行累积操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2015-02-14
    • 1970-01-01
    • 2019-03-21
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多