在透视表中处理多级列索引

3

我看到这个问题被多次提出,但其他问题的解决方案都没有起作用!

我有一个数据框架,如下所示:

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],})

df

使用 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名称,可以参考如下过去的解决方案: 尝试在DataFrame.pivot中创建多重索引时出现ValueError 从使用pivot_table()创建的df中删除索引名称 在pandas中进行pivot_table后重置为平坦索引 保留pandas pivot_table中的索引
df_sum_table = (pd.pivot_table(df,index=['id'], columns = ['date'], values = ['mean','std'])).reset_index().rename_axis(None, axis=1)

但是遇到了错误

类型错误:必须像 names 一样传递列表。

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

期望输出结果

enter image description here

@jezrael

1个回答

1
尝试使用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并使用字典映射重命名特定列轴名称。我为列轴名称映射指定了columns参数。

感谢您的快速回复!我们能否制作像OP中最后一个Excel表格那样的表格? - Alexander
真的!我没有看到fillna('')和没有fillna()有任何变化。你也可以确认一下吗?那个移位我真的需要! - Alexander
无论如何产生所需的输出! - Alexander
@Alexander 等我10分钟,抱歉我得离开一会儿。 - U13-Forward
哇,我没想到会有这样的多重重命名代码:)). .rename_axis(columns={'date': None}).fillna('').reset_index().T.reset_index(level=1).T.reset_index(drop=True).reset_index(drop=True) - Alexander
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接