2017-01-30 250 views
4

说我有一个列上的分层指数pandas.DataFrame如下:如何平铺pandas DataFrame中的层次列索引?

import pandas as pd 
columns = pd.MultiIndex.from_product([list('AB'), list('ab')]) 
df = pd.DataFrame(np.arange(8).reshape((2,4)), columns=columns) 
print df 

输出[1]:

A  B 
    a b a b 
0 0 1 2 3 
1 4 5 6 7 

我想变平的列索引,所以它看起来如下:

Aa Ab Ba Bb 
0 0 1 2 3 
1 4 5 6 7 

我试图

def flatten(col): 
    col.name = ''.join(col.name) 
    return col 

df.apply(f) 

但这只是忽略了新列的修改名称。

回答

9

使用map

df.columns = df.columns.map(''.join) 
df 

    Aa Ab Ba Bb 
0 0 1 2 3 
1 4 5 6 7 

使用rename

df.rename(columns=''.join) 

    Aa Ab Ba Bb 
0 0 1 2 3 
1 4 5 6 7 
+0

我喜欢重新命名的版本,但它在0.16.1版本中对我无效。 – snth

+0

我遇到了''df.columns.map(''。join)'带'int'类型列索引的问题。 –

3

您可以使用list comprehensionjoin

df.columns = [''.join(col) for col in df.columns] 
print (df) 
    Aa Ab Ba Bb 
0 0 1 2 3 
1 4 5 6 7 

另一种可能的解决方案:

df.columns = df.columns.to_series().str.join('') 
print (df) 
    Aa Ab Ba Bb 
0 0 1 2 3 
1 4 5 6 7 
+0

感谢。这就是我想要的。 – snth

0

下面的作品,但创建一个新的DataFrame

df_flat = pd.DataFrame({''.join(k):v for k,v in df.iteritems()}) 
print df_flat 

出[3]:

Aa Ab Ba Bb 
0 0 1 2 3 
1 4 5 6 7 
相关问题