2016-08-15 2 views
0

저는 일부 NaN 값을 채우기 위해 팬더 데이터 프레임을 가지고 있습니다. 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 사이에있을 수있는 훨씬 더 큰 DataFrame (수백만 개의 행)에서 수행해야' 년 '이고 이름 값은 최근 연도에만 나타납니다. 나는 성능 목적으로 행을 반복하는 것을 피하려고 노력하고있다.

답변

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 포함되어 있지 않습니다 당신은 교체해야 할 NaN 문자열 np.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