2015-01-12 5 views
36

मान लीजिए मैं कुछ NaN रों के साथ एक DataFrame है:पांडा डेटाफ्रेम में मानों से पहले NaNs को कैसे प्रतिस्थापित करें?

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

मैं कर सकते हैं बस पूरे DataFrame स्तंभ-दर-स्तंभ, तत्व-दर-तत्व और मूल्यों सीधे सेट के माध्यम से लूप, लेकिन वहाँ एक आसान (बेहतर एक पाश है -फ्री) इसे प्राप्त करने का तरीका?

उत्तर

59

आप DataFrame पर 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 rebind करने वरना inplace=True निर्दिष्ट की आवश्यकता होगी:

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

आप method='ffill' विकल्प के साथ pandas.DataFrame.fillna उपयोग कर सकते हैं। '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 के लिए एक सीधा पर्याय समारोह, बातें सरल बनाने के लिए है।

2

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

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 
4

स्वीकार किए जाते हैं जवाब एकदम सही है है। मेरे पास एक संबंधित लेकिन थोड़ी अलग स्थिति थी जहां मुझे आगे भरना था, लेकिन केवल समूहों के भीतर। अगर किसी को भी वही ज़रूरत है, तो पता है कि fillna 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 
+0

ठीक वही जो मैं खोज रहा था, ty – Tony

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