簡體   English   中英

熊貓:用下一個非NaN /#連續NaN填充NaNs

[英]Pandas: Fill NaNs with next non-NaN / # consecutive NaNs

我正在尋找一個熊貓系列,並用下一個數值的平均值填充NaN ,其中: average = next numerical value / (# consecutive NaNs + 1)

到目前為止,這是我的代碼,我只是無法弄清楚如何在num中將filler列除以NaN (以及下一個數值):

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
  • 采取逆向的cumsum notnull
  • 用它來groupby並用mean transform

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
  • 我希望我的平均值包括空值的數量。 最簡單的方法是填充零,並對剛剛制作的組II采取正常的平均值。
  • transform為現有索引的廣播
  • assign新列。 盡管已經扭轉了這個系列,但該指數將像魔術一樣重新調整。 可以使用loc但是會覆蓋現有的df 如果他們願意,我會讓OP決定覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM