2017-04-19 16 views
8

Bir pandalar dizisi çekmek ve bir sonraki sayısal değeri ortalama NaN doldurmak için arıyorum ardışık/# ile NaN'ler doldurun sadece num içinde NaN s arasında filler kolonu (ve de bir sonraki sayısal değeri) bölmek için nasıl şekil olamaz:Pandalar: <code>average = next numerical value/(# consecutive NaNs + 1)</code></p> <p>İşte şimdiye kadar kodum, ben: Önümüzdeki olmayan NaN NaN'ler

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') 

Akım Çıkış:

  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 

İstenilen Çıktı:

  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 
+0

Birkaç denemeyi denedim ... ama sonunda :-) – piRSquared

cevap

11
  • bir ters atın notnull
  • Kullanım cumsum o groupby ve transform ile mean

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 

o

  • df.num.notnull().cumsum() nasıl çalıştığını bitişik boş değerlere gruplarını bulmak için standart bir tekniktir. Ancak, grupların bir sonraki sayısal değerle bitmesini istedim. Bu yüzden diziyi tersine çevirdim ve sonra cumsum 'd.
  • Ortalamalarımın sayısını içermesini istiyorum. Bunu yapmanın en kolay yolu, sıfır ile doldurmak ve yaptığım grupların üzerinde normal bir anlam ifade etmektir.
  • transform varolan dizinde bir yayın için
  • assign yeni sütun. Diziyi tersine çevirmesine rağmen, dizin sihir gibi yeniden hizalanacaktır. loc kullanmış olabilir, ancak mevcut df'un üzerine yazılmıştır. OP'nin isterlerse üzerine yazmasına karar vereceğim.
+0

aldım hi @piRSquared: Bu soruna dikkat eder misiniz? http://stackoverflow.com/questions/43475370/how-to-merge-two-pandas-dataframes-or-transfer-values-by-comparing-ranges-of-v – everestial007

+0

İşte bu, her zamanki gibi teşekkürler. Neler olduğu hakkında tam olarak ne olduğunu anımsatan bir şey mi var? İlk aldığım ikinci satır ... ... birinci ve üçüncü kafamın biraz üstünde. – pshep123

+0

@ pshep123 Bulanık – piRSquared

İlgili konular