【问题标题】:Pandas: Fill NaNs with next non-NaN / # consecutive NaNsPandas:用下一个非 NaN / # 个连续的 NaN 填充 NaN
【发布时间】:2017-09-16 09:27:00
【问题描述】:

我正在寻找一个熊猫系列并用下一个数值的平均值填充NaN,其中:average = next numerical value / (# consecutive NaNs + 1)

到目前为止,这是我的代码,我只是不知道如何在num 中的NaNs(以及下一个数值)中划分filler 列:

import pandas as pd

dates = pd.date_range(start = '1/1/2016',end = '1/12/2016', freq = 'D')
nums = [10, 12, None, None, 39, 10, 11, None, None, None, None, 60]

df = pd.DataFrame({
        'date':dates, 
        'num':nums
        })

df['filler'] = df['num'].fillna(method = 'bfill')

电流输出:

         date   num  filler
0  2016-01-01  10.0    10.0
1  2016-01-02  12.0    12.0
2  2016-01-03   NaN    39.0
3  2016-01-04   NaN    39.0
4  2016-01-05  39.0    39.0
5  2016-01-06  10.0    10.0
6  2016-01-07  11.0    11.0
7  2016-01-08   NaN    60.0
8  2016-01-09   NaN    60.0
9  2016-01-10   NaN    60.0
10 2016-01-11   NaN    60.0
11 2016-01-12  60.0    60.0

期望的输出:

         date   num
0  2016-01-01  10.0
1  2016-01-02  12.0
2  2016-01-03  13.0
3  2016-01-04  13.0
4  2016-01-05  13.0
5  2016-01-06  10.0
6  2016-01-07  11.0
7  2016-01-08  12.0
8  2016-01-09  12.0
9  2016-01-10  12.0
10 2016-01-11  12.0
11 2016-01-12  12.0

【问题讨论】:

  • 试了几次......但我最终得到了:-)

标签: python pandas pandas-groupby


【解决方案1】:
  • 取反 cumsumnotnull
  • 将其用于groupbytransformmean

csum = df.num.notnull()[::-1].cumsum()
filler = df.num.fillna(0).groupby(csum).transform('mean')
df.assign(filler=filler)

         date   num  filler
0  2016-01-01  10.0    10.0
1  2016-01-02  12.0    12.0
2  2016-01-03   NaN    13.0
3  2016-01-04   NaN    13.0
4  2016-01-05  39.0    13.0
5  2016-01-06  10.0    10.0
6  2016-01-07  11.0    11.0
7  2016-01-08   NaN    12.0
8  2016-01-09   NaN    12.0
9  2016-01-10   NaN    12.0
10 2016-01-11   NaN    12.0
11 2016-01-12  60.0    12.0

工作原理

  • df.num.notnull().cumsum() 是一种查找连续空值组的标准技术。但是,我希望我的组以下一个数值结束。所以我把这个系列反过来了,然后cumsum'd。
  • 我希望我的平均值包括空值的数量。最简单的方法是用零填充,然后对我刚刚创建的组取正常平均值。
  • transform 在现有索引中广播
  • assign 新专栏。尽管反转了系列,但该指数将像魔术一样重新调整。本来可以使用loc,但这会覆盖现有的df。如果他们愿意,我会让 OP 决定覆盖。

【讨论】:

  • 嗨@piRSquared:你能看看这个问题吗? stackoverflow.com/questions/43475370/…
  • 就是这样,一如既往的感谢。介意快速记下那里到底发生了什么吗?我得到的第二行……第一行和第三行有点过头了。
  • @pshep123 模糊
  • 非常好 - 这非常有用。再次感谢!
  • 又一个@piRSquared 解决方案,我将在我的技巧柜中归档以备将来使用。 “反向cumsum groupby变换”明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 2016-09-18
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多