【问题标题】:How do I flatten a hierarchical column index in a pandas DataFrame?如何展平熊猫 DataFrame 中的分层列索引?
【发布时间】:2026-01-30 19:50:01
【问题描述】:

假设我有一个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)

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    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
    

    【讨论】:

    • 我最喜欢重命名版本,但在 0.16.1 版本中对我不起作用。
    • 我遇到了df.columns.map(''.join)int 类型列索引的问题。
    • 会检查的。感谢您提出。
    • @dreyco676 当类型为int 时解决方案不同
    • df.columns = (''.join(str(col)) for col in df.columns.values) 似乎可以解决问题。
    【解决方案2】:

    您可以将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
    

    【讨论】:

    • 谢谢。这就是我想要的。
    • 嗨,你能帮忙回答一下this
    【解决方案3】:

    以下工作但会创建一个新的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
    

    【讨论】: