【问题标题】:Pandas DataFrame MultiIndex Pivot - Remove Empty Headers and Axis RowsPandas DataFrame MultiIndex Pivot - 删除空标题和轴行
【发布时间】:2021-12-25 07:09:20
【问题描述】:

这与我之前在此处Python Pandas Dataframe Pivot Table Column and Values Order 提出的问题密切相关。再次感谢您的帮助。非常感谢。

我正在尝试自动化报告,该报告将通过电子邮件分发给大量受众,因此它需要看起来“漂亮”:)

我在重置/删除索引和/或轴后枢轴以使我能够使用 .style CSS 函数(即从 df 创建 Styler 对象)来使表格看起来不错时遇到问题。

我有一个 DataFrame,其中两个主要字段(在我的示例中,它们是“Name”和“Bucket”)将是可变的。所需的显示顺序也会改变(因此不能硬编码),但它可以在应用程序的早期(例如“Name_Rank”和“Bucket_Rank”)导出为可以轻松排序的整数“排序值”(和理论上后来下降)。

我可以删除列排序值,但不能删除行/标题/轴(?)。此外,无论我尝试什么,我似乎都无法摆脱标题和 DataTable 之间的空白行。

我(认为)我需要设置 Index = Bucket 和 Headers = "Name" 和 "TDY/Change" 以正确使用 .style 样式对象功能。

    import pandas as pd
    import numpy as np

    data = [
    ['AAA',2,'X',3,5,1],
    ['AAA',2,'Y',1,10,2],
    ['AAA',2,'Z',2,15,3],
    ['BBB',3,'X',3,15,3],
    ['BBB',3,'Y',1,10,2],
    ['BBB',3,'Z',2,5,1],
    ['CCC',1,'X',3,10,2],
    ['CCC',1,'Y',1,15,3],
    ['CCC',1,'Z',2,5,1],
    ]

    df = pd.DataFrame(data, columns = 
    ['Name','Name_Rank','Bucket','Bucket_Rank','Price','Change'])

    display(df)
Name Name_Rank Bucket Bucket_Rank Price Change
0 AAA 2 X 3 5 1
1 AAA 2 Y 1 10 2
2 AAA 2 Z 2 15 3
3 BBB 3 X 3 15 3
4 BBB 3 Y 1 10 2
5 BBB 3 Z 2 5 1
6 CCC 1 X 3 10 2
7 CCC 1 Y 1 15 3
8 CCC 1 Z 2 5 1

根据之前的问题/答案,我几乎可以将表格转换为正确的格式:

    df2 = (pd.pivot_table(df, values=['Price','Change'],index=['Bucket_Rank','Bucket'], 
    columns=['Name_Rank','Name'], aggfunc=np.mean)
        .swaplevel(1,0,axis=1)
        .sort_index(level=0,axis=1)
        .reindex(['Price','Change'],level=1,axis=1)
        .swaplevel(2,1,axis=1)
        .rename_axis(columns=[None,None,None])
        ).reset_index().drop('Bucket_Rank',axis=1).set_index('Bucket').rename_axis(columns= 
         [None,None,None])

看起来像这样:

1 2 3
CCC AAA BBB
Price Change Price Change Price Change
Bucket
Y 15 3 10 2 10 2
Z 5 1 15 3 5 1
X 10 2 5 1 15 3

好的,所以...

A) 我如何摆脱曾经是“Name_Rank”的行/标题/轴(?)(例如整数“排序值”1、2、3)。我想出了一个技巧,将 df 导出到 XLS/使用 Header=(1,2) 重新导入,但这不是实现目标的最佳方式。

B) 如何去掉表格中数据上方的空白行?根据我在网上阅读的内容,您似乎应该“rename_axis=[None]”,但无论我尝试哪种顺序,这似乎都不起作用。

C) 有没有一种方法可以设置标题,使得以前的“名称”和“价格/更改”行都是标题,以便可以使用 .style 功能将它们与下表中的数据?

非常感谢任何人提出的任何建议。我完全被困住了!

干杯, 德文郡

【问题讨论】:

  • A 和 B 是在 pandas 版本 1.4.0 中开发的(未发布 - 抱歉当前版本中不可用)。那么它只是一个做df2.hide(level=0, axis="columns").hide(names=True, axis="index")的案例
  • @Attack68 谢谢!不过,我有点困惑,这个 .hide 功能是否可用?我尝试了建议的解决方案,并通过 Pandas 文档尝试了,但它似乎不起作用。

标签: python pandas dataframe pivot-table multi-index


【解决方案1】:

在 pandas 1.4.0 中,A 和 B 的选项可直接使用 Styler.hide 方法获得:

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2016-09-18
    • 2019-08-02
    • 2020-04-11
    • 2019-05-20
    相关资源
    最近更新 更多