2017-04-19 10 views
8

मैं एक पांडा श्रृंखला लेने के लिए और अगले संख्यात्मक मूल्य जहां की औसत के साथ NaN को भरने के लिए देख रहा हूँ के साथ भरें Nans बस को समझ नहीं सकता num में NaN रों बीच filler स्तंभ (और साथ ही अगले संख्यात्मक मूल्य) विभाजित करने के लिए कैसे:पांडा: <code>average = next numerical value/(# consecutive NaNs + 1)</code></p> <p>यहाँ अब तक मेरी कोड है, मैं: अगले गैर NaN/# लगातार Nans

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

मुझे कुछ कोशिशें ले लीं ... लेकिन मुझे अंत में मिला :-) – piRSquared

उत्तर

11
  • एक रिवर्स ले लो की notnull
  • उपयोग cumsum कि groupby करने और transform साथ 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 

यह कैसे काम करता

  • df.num.notnull().cumsum() सन्निहित nulls के समूहों को खोजने के लिए एक मानक तकनीक है। हालांकि, मैं चाहता था कि मेरे समूह अगले संख्यात्मक मूल्य के साथ समाप्त हो जाएं। तो मैंने श्रृंखला को उलट दिया और फिर cumsum 'डी।
  • मैं चाहता हूं कि मेरा औसत नल की संख्या शामिल करे। ऐसा करने का सबसे आसान तरीका शून्य से भरना है और मैंने जो समूहों को बनाया है, उनके ऊपर सामान्य अर्थ लेना है।
  • transform मौजूदा इंडेक्स
  • assign नया कॉलम पर प्रसारित करने के लिए। श्रृंखला को उलटने के बावजूद, सूचकांक जादू की तरह रुक जाएगा। loc का उपयोग किया जा सकता था लेकिन यह मौजूदा df को ओवरराइट करता है। मैं ओपी को ओवरराइट करने का फैसला करूंगा यदि वे चाहते हैं।
+0

hi @piRSquared: क्या आप कृपया इस समस्या को देख सकते हैं? http://stackoverflow.com/questions/43475370/how-to-merge-two-pandas-dataframes-or-transfer-values-by-comparing-ranges-of-v – everestial007

+0

यही है, हमेशा के रूप में धन्यवाद। मन में क्या चल रहा है इसके बारे में एक त्वरित अस्पष्टता को झुकाव मन? दूसरी पंक्ति मुझे मिलती है ... पहले और तीसरे मेरे सिर पर थोड़ा सा है। – pshep123

+0

@ pshep123 धुंधला – piRSquared

संबंधित मुद्दे