2017-01-30 123 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 
相關問題