处理 pivot_table 中的多索引列

Manipulate multiindex column in pivot_table

我看到这个问题问了很多次,但其他问题的解决方案没有用!

我有这样的数据框

df = pd.DataFrame({
"date": ["20180920"] * 3 + ["20180921"] * 3,
"id": ["A12","A123","A1234","A12345","A123456","A0"],
"mean": [1,2,3,4,5,6],
"std" :[7,8,9,10,11,12],
"test": ["a", "b", "c", "d", "e", "f"],
"result": [70, 90, 110, "(-)", "(+)", 0.3],})

使用pivot_table

df_sum_table = (pd.pivot_table(df,index=['id'], columns = ['date'], values = ['mean','std']))

我得到了

df_sum_table.columns

MultiIndex([('mean', '20180920'),
        ('mean', '20180921'),
        ( 'std', '20180920'),
        ( 'std', '20180921')],
       names=[None, 'date'])

所以我想将 date 列移到下方一行并删除 id 行。但保留 id 名称。 通过遵循这些过去的解决方案

df_sum_table = (pd.pivot_table(df,index=['id'], columns = ['date'], values = ['mean','std'])).reset_index().rename_axis(None, axis=1)

但出现错误

TypeError: Must pass list-like as names.

如何删除 date 但保留第一列中的 id

期望的输出

@jezrael

试试 rename_axis:

df = df.pivot_table(index=['id'], columns = ['date'], values = ['mean', 'std']).rename_axis(columns={'date': None}).fillna('').reset_index().T.reset_index(level=1).T.reset_index(drop=True).reset_index(drop=True)
df.index = df.pop('id').replace('', 'id').tolist()
print(df)

输出:

             mean      mean       std       std
id       20180920  20180921  20180920  20180921
A0                        6                  12
A12             1                   7          
A123            2                   8          
A1234           3                   9          
A12345                    4                  10
A123456                   5                  11

您可以使用 rename_axis 并使用字典映射重命名特定的列轴名称。我为列轴名称映射指定列参数。