2016-09-15 5 views
2

MultiIndex를 사용하여 엑셀 시트를 읽은 후 일부 값이 'N/A'이고 pd.read_excel이 생각하기 때문에 인덱스에 np.nan이 표시됩니다. 그 (것)들을 개조하는 좋은 생각. 그러나 다중 색인을 유지하기 위해 'N/A'로 유지하려고합니다. 나는 MultiIndex.fillna을 사용하여 다시 변경하기 쉬운 것이라고 생각하지만 난이 오류를 얻을 :팬더 MultiIndex의 모든 레벨에서 NaN 값 바꾸기

index = pd.MultiIndex(levels=[[u'foo', u'bar'], [u'one', np.nan]], 
      labels=[[0, 0, 1, 1], [0, 1, 0, 1]], 
      names=[u'first', u'second']) 
df = pd.DataFrame(index=index, columns=['A', 'B']) 
df 

enter image description here

df.index.fillna("N/A") 

출력 :

--------------------------------------------------------------------------- 
NotImplementedError      Traceback (most recent call last) 
<ipython-input-26-a1e3a4802da7> in <module>() 
----> 1 df.index.fillna("N/A") 

/Users/billtubbs/anaconda/lib/python2.7/site-packages/pandas/indexes/multi.pyc in fillna(self, value, downcast) 
    588  def fillna(self, value=None, downcast=None): 
    589   # isnull is not implemented for MultiIndex 
--> 590   raise NotImplementedError('isnull is not defined for MultiIndex') 
    591 
    592  def get_value(self, series, key): 

NotImplementedError: isnull is not defined for MultiIndex 
+0

이것은 다음과 같은 해결책으로 생각됩니다 :'new_index = pd.MultiIndex (levels = [index.levels [0] .fillna ('N/A'), index.levels [1] .fillna (' N/A ')], labels = index.labels, names = index.names)'하지만 내 실제 데이터 프레임은 6 레벨의 다중 인덱스이므로 좀 지저분합니다. – Bill

+0

인덱스 힌트없이 데이터 프레임을로드하고 NA 항목을 마사지 한 다음 set_index를 제안합니다. 그 순서대로 진행할 수없는 이유는 무엇입니까? – Boud

+0

덕분에 @Boud도 가능합니다. – Bill

답변

3

사용 set_levels

df.index.set_levels([l.fillna('N/A') for l in df.index.levels], inplace=True) 
df 

enter image description here

+1

OP에는 6 단계가 있습니다! 한 번에 모든 레벨을 수정하는 대답을 업데이트 하시겠습니까? –

+0

@NehalJWani 업데이트 된 게시물, 완전 일반화. 감사합니다 – piRSquared

+0

: -o set_levels가 인수에 List를 지원했는지 몰랐습니다! –