2015-01-12 21 views
36

は、私はいくつかのNaN sのデータフレームがあるとします。pandas DataFrameの前の値でNaNを置き換えるには?

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

Iは、全体のデータフレームの列ごとスルーだけループすることができる要素ごとの直接値を設定するが、簡単に(最適にはループが存在するであろうこれを達成する方法?

答えて

59

あなたは(記入フォワード)DATAFRAMEにfillnaメソッドを使用してffillなどの方法を指定することができます。

伝播[s]は、最後の有効な観察前方

>>> 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メソッドもあります。

このメソッドは、データフレームインプレースを変更しません - あなたが変数に返されたデータフレームを再バインドか、他inplace=Trueを指定する必要があります:あなたはmethod='ffill'オプションでpandas.DataFrame.fillnaを使用することができます

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

'ffill'は 'forward fill'の略で、有効な最後の観測を伝播します。代わりは'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

この解決策を試しているときに気付いたのは、アレイの最初または最後にN/Aがあると、ffillとbfillがうまく動作しないということです。あなたは両方が必要です。

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

関連する問題