2015-02-09 38 views
1

我有一個熊貓數據幀,它看起來像:促進某些行指數有序大熊貓據幀

df=pd.DataFrame(index=['Asia','China','India','Europe','France','Hungary']) 
df[2008]=20080 
df[2009]=20090 
df.loc['Europe']=np.NaN 
df.loc['Asia']=np.NaN 
print df 

      2008 2009 
Asia  NaN NaN 
China 20080 20090 
India 20080 20090 
Europe  NaN NaN 
France 20080 20090 
Hungary 20080 20090 

我想以「推動」歐洲和亞洲是MultiIndexes,比他們的成分的國家一級高以產生:

    2008 2009 
Asia China 20080 20090 
     India 20080 20090 
Europe France 20080 20090 
     Hungary 20080 20090 

這是可能的一個漂亮的方式,知道這些可促進行有所有NaN?

+0

此外,數據幀是有序的,因此從理論上講,在亞洲和歐洲的所有NaN線之間,假設只有亞洲國家。 – csaladenes 2015-02-09 23:45:35

回答

1

你可以用cumsum()做到這一點:

In [11]: cont = df.isnull().all(1) 

In [12]: cont 
Out[12]: 
Asia  True 
China  False 
India  False 
Europe  True 
France  False 
Hungary False 
dtype: bool 

這使您可以標記大陸的每一行*:

In [13]: continents = df.index[cont][cont.cumsum() - 1] 

In [14]: continents 
Out[14]: Index([u'Asia', u'Asia', u'Asia', u'Europe', u'Europe', u'Europe'], dtype='object') 

In [15]: df.set_index([continents, df.index], inplace=True) 

In [16]: df 
Out[16]: 
       2008 2009 
Asia Asia  NaN NaN 
     China 20080 20090 
     India 20080 20090 
Europe Europe  NaN NaN 
     France 20080 20090 
     Hungary 20080 20090 

In [17]: df.dropna() 
Out[17]: 
       2008 2009 
Asia China 20080 20090 
     India 20080 20090 
Europe France 20080 20090 
     Hungary 20080 20090 

*注:它可以更有效地不請執行此步驟並設置MultiIndex中的級別:

In [21]: res = df.set_index([cont, df.index]) 

In [21]: res.index = res.index.set_levels(df.index[cont], 0) 

此外,你可以構建這個而不是的NaN(所以你不必在之後dropna)。


注:它可能是一個更有效地做到這一點,而閱讀作爲數據(即建築/ CONCAT期間)...

+1

'cumsum'太棒了!我強制它之前像:for i in df.T.iteritems():if np.isnan(i [1])。all():superIndex.append(currentIndex) – csaladenes 2015-02-10 01:42:51