पांडा डेटाफ़्रेम में पूर्ववर्ती मानों को बदलकर NaN कैसे बदलें?


140

मान लीजिए कि मेरे पास कुछ NaNs के साथ एक DataFrame है :

>>> import pandas as pd
>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df
    0   1   2
0   1   2   3
1   4 NaN NaN
2 NaN NaN   9

मुझे जो करने की आवश्यकता है, NaNवह पहले गैर- NaNमूल्य के साथ उसी कॉलम के ऊपर प्रतिस्थापित किया गया है। यह माना जाता है कि पहली पंक्ति में कभी नहीं होगा NaN। तो पिछले उदाहरण के लिए परिणाम होगा

   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

मैं बस पूरे डेटाफ़्रेम कॉलम-बाय-कॉलम, एलिमेंट-बाय-एलिमेंट के माध्यम से लूप कर सकता हूं और सीधे मान सेट कर सकता हूं, लेकिन क्या इसे प्राप्त करने का एक आसान (बेहतर लूप-फ्री) तरीका है?

जवाबों:


213

आप fillnaडेटाफ़्रेम पर विधि का उपयोग कर सकते हैं और ffill(आगे भरें) के रूप में विधि निर्दिष्ट कर सकते हैं :

>>> df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
>>> df.fillna(method='ffill')
   0  1  2
0  1  2  3
1  4  2  3
2  4  2  9

यह विधि...

प्रचार [एस] अंतिम वैध अवलोकन अगले वैध के लिए आगे

विपरीत रास्ते पर जाने के लिए, एक bfillविधि भी है ।

यह विधि DataFrame inplace को संशोधित नहीं करती है - आपको दिए गए DataFrame को एक वैरिएबल को रिवाइंड करने की आवश्यकता होगी या फिर और निर्दिष्ट करें inplace=True:

df.fillna(method='ffill', inplace=True)

31

स्वीकृत उत्तर एकदम सही है। मेरे पास संबंधित लेकिन थोड़ी अलग स्थिति थी जहां मुझे आगे बढ़ना था लेकिन केवल समूहों के भीतर। मामले में किसी को एक ही जरूरत है, पता है कि भरण एक DataFrameGroupBy ऑब्जेक्ट पर काम करता है।

>>> example = pd.DataFrame({'number':[0,1,2,nan,4,nan,6,7,8,9],'name':list('aaabbbcccc')})
>>> example
  name  number
0    a     0.0
1    a     1.0
2    a     2.0
3    b     NaN
4    b     4.0
5    b     NaN
6    c     6.0
7    c     7.0
8    c     8.0
9    c     9.0
>>> example.groupby('name')['number'].fillna(method='ffill') # fill in row 5 but not row 3
0    0.0
1    1.0
2    2.0
3    NaN
4    4.0
5    4.0
6    6.0
7    7.0
8    8.0
9    9.0
Name: number, dtype: float64

वास्तव में मैं क्या देख रहा था, ty
टोनी

18

आप विकल्प के pandas.DataFrame.fillnaसाथ उपयोग कर सकते हैं method='ffill''ffill''फॉरवर्ड फिल' के लिए खड़ा है और अंतिम वैध अवलोकन को आगे बढ़ाएगा। विकल्प है 'bfill'जो उसी तरह से काम करता है, लेकिन पीछे की तरफ।

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])
df = df.fillna(method='ffill')

print(df)
#   0  1  2
#0  1  2  3
#1  4  2  3
#2  4  2  9

pandas.DataFrame.ffillचीजों को सरल बनाने के लिए , इसके लिए एक प्रत्यक्ष पर्याय फ़ंक्शन भी है।


14

इस समाधान को आजमाते समय एक बात जो मैंने देखी, वह यह है कि यदि आपके पास आर या एरे के अंत में एन / ए है, तो एफिल और बीफिल काफी काम नहीं करते हैं। आपको दोनों की आवश्यकता है।

In [224]: df = pd.DataFrame([None, 1, 2, 3, None, 4, 5, 6, None])

In [225]: df.ffill()
Out[225]:
     0
0  NaN
1  1.0
...
7  6.0
8  6.0

In [226]: df.bfill()
Out[226]:
     0
0  1.0
1  1.0
...
7  6.0
8  NaN

In [227]: df.bfill().ffill()
Out[227]:
     0
0  1.0
1  1.0
...
7  6.0
8  6.0

प्रतिभाशाली। मुझे अपनी समस्या के लिए ठीक यही चाहिए था। पहले और बाद दोनों को भरना। बहुत बहुत धन्यवाद।
प्रोमेथियस

महान। मुझे इस समाधान की आवश्यकता है। धन्यवाद
Junkrat


5

केवल एक कॉलम संस्करण

  • अंतिम मान्य मान के साथ एनएएन भरें
df[column_name].fillna(method='ffill', inplace=True)
  • अगले मान्य मान के साथ NAN भरें
df[column_name].fillna(method='backfill', inplace=True)

5

बस ffillविधि के साथ सहमत होना , लेकिन एक अतिरिक्त जानकारी यह है कि आप कीवर्ड तर्क के साथ आगे भरने को सीमित कर सकते हैं limit

>>> import pandas as pd    
>>> df = pd.DataFrame([[1, 2, 3], [None, None, 6], [None, None, 9]])

>>> df
     0    1   2
0  1.0  2.0   3
1  NaN  NaN   6
2  NaN  NaN   9

>>> df[1].fillna(method='ffill', inplace=True)
>>> df
     0    1    2
0  1.0  2.0    3
1  NaN  2.0    6
2  NaN  2.0    9

अब limitकीवर्ड तर्क के साथ

>>> df[0].fillna(method='ffill', limit=1, inplace=True)

>>> df
     0    1  2
0  1.0  2.0  3
1  1.0  2.0  6
2  NaN  2.0  9

1

मेरे मामले में, हमारे पास विभिन्न उपकरणों से समय श्रृंखला है लेकिन कुछ डिवाइस कुछ अवधि के दौरान कोई मूल्य नहीं भेज सकते हैं। इसलिए हमें हर डिवाइस और टाइम पीरियड के लिए NA मान बनाना चाहिए और उसके बाद फिल करना चाहिए।

df = pd.DataFrame([["device1", 1, 'first val of device1'], ["device2", 2, 'first val of device2'], ["device3", 3, 'first val of device3']])
df.pivot(index=1, columns=0, values=2).fillna(method='ffill').unstack().reset_index(name='value')

परिणाम:

        0   1   value
0   device1     1   first val of device1
1   device1     2   first val of device1
2   device1     3   first val of device1
3   device2     1   None
4   device2     2   first val of device2
5   device2     3   first val of device2
6   device3     1   None
7   device3     2   None
8   device3     3   first val of device3

0

आप fillnaNaN मानों को हटाने या बदलने के लिए उपयोग कर सकते हैं ।

NaN निकालें

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, None, None], [None, None, 9]])

df.fillna(method='ffill')
     0    1    2
0  1.0  2.0  3.0
1  4.0  2.0  3.0
2  4.0  2.0  9.0

NaN बदलें

df.fillna(0) # 0 means What Value you want to replace 
     0    1    2
0  1.0  2.0  3.0
1  4.0  0.0  0.0
2  0.0  0.0  9.0

संदर्भ पंडों.दताफ्रेम.फिलना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.