在有序的pandas数据帧中提升某些行以进行索引

时间:2015-02-09 23:43:31

标签: python pandas

我有一个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吗?

1 个答案:

答案 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的情况下构建这个(所以你不必在之后删除)。


注意:在读取数据时(即在构建/连接期间)执行此操作可能更有效...