我有一个pandas数据框,如下所示:
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 :(得分: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的情况下构建这个(所以你不必在之后删除)。
注意:在读取数据时(即在构建/连接期间)执行此操作可能更有效...