如何在pandas DataFrame中展平分层列索引?

时间:2017-01-30 08:11:40

标签: python pandas

假设我的列上有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)

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

3 个答案:

答案 0 :(得分:15)

set_axis

df.set_axis([f"{x}{y}" for x, y in df.columns], axis=1, inplace=False)

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

index.map

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

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

对于非字符串列值

df.columns = df.columns.map(lambda x: ''.join([*map(str, x)]))
df

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

答案 1 :(得分: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

答案 2 :(得分: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