2016-08-15 24 views
0

私は、いくつかのNaN値を記入したいと思うpandasデータフレームを持っています。MultiIndex Pandasに基づいてNaNを記入してください

import pandas as pd 

tuples = [('a', 1990),('a', 1994),('a',1996),('b',1992),('b',1997),('c',2001)] 
index = pd.MultiIndex.from_tuples(tuples, names = ['Type', 'Year']) 
vals = ['NaN','NaN','SomeName','NaN','SomeOtherName','SomeThirdName'] 
df = pd.DataFrame(vals, index=index) 

print(df) 

         0 
Type Year    
a 1990   NaN 
    1994   NaN 
    1996  SomeName 
b 1992   NaN 
    1997 SomeOtherName 
c 2001 SomeThirdName 

私は希望の出力は次のようになります。

Type Year    
a 1990  SomeName 
    1994  SomeName 
    1996  SomeName 
b 1992 SomeOtherName 
    1997 SomeOtherName 
c 2001 SomeThirdName 

これは、各「タイプ」は独自の1-5 'の間に持つことができる非常に大きなデータフレーム(数百万行)に行われる必要があります「年」と名前の値は、最新の年だけ存在します。私はパフォーマンスの目的のために行を反復することを避けようとしています。

答えて

1

あなたはffillそれを降順にインデックスして、データフレームを並べ替えることができ:

import pandas as pd 
df.sort_index(level = [0,1], ascending = False).ffill() 

#       0 
# Type Year  
# c 2001 SomeThirdName 
# b 1997 SomeOtherName 
#  1992 SomeOtherName 
# a 1996 SomeName 
#  1994 SomeName 
#  1990 SomeName 

注:サンプルデータが実際に仕事にffillためにnp.nan値が、文字列NaN、ようが含まれていませんがあなたはnp.nanとしてNaN文字列を置換する必要があります。

import numpy as np 
df[0] = np.where(df[0] == "NaN", np.nan, df[0]) 

それとも@ayhanとしてはで文字列「はNaNを」交換した後、提案しましたを使用してください。df.bfill()

+0

または直接 '.bfill()'? :) – ayhan

+0

@ayhanここに必要なのは正確です。 – Psidom

関連する問題