Python:如何移除MultiIndex DataFrame显示空行并调整索引名位置
调整MultiIndex DataFrame的索引显示并导出为PNG
我有一个带多层索引(MultiIndex)的Python DataFrame,当前显示效果存在索引名“index1”“index2”位置靠下、数据上方有空行的问题。想要将这两个索引名上移,同时删除数据上方的空行,最终把调整后的DataFrame导出为PNG格式。
初始代码
import pandas as pd import numpy as np style_valeurs = {"background-color" : "white", "color" : "black", "border-color" : "black", "border-style" : "solid", "border-width" : "1px"} style_col = [{"selector": "thead", "props": "background-color:yellow; color :black; border:3px black;border-style: solid; border-width: 1px" },{ 'selector':"th:not(.index_name)", 'props':"background-color: yellow; border-color: black;border-style: solid ;border-width: 1px; text-align:left" }] data = np.random.rand(4,4) columns = pd.MultiIndex.from_product([["A","B"],["C","D"]]) index = pd.MultiIndex.from_product([["x","y"],["1","2"]]) df = pd.DataFrame(data, columns = columns, index = index) df.rename_axis(["index1","index2"], inplace = True) df.style.set_properties(**style_valeurs).set_table_styles(style_col)
解决方法
1. 调整索引名位置与移除空行
通过修改表格样式规则,让索引名上移并消除数据上方的空行,同时保证样式统一:
import pandas as pd import numpy as np style_valeurs = {"background-color": "white", "color": "black", "border-color": "black", "border-style": "solid", "border-width": "1px"} style_col = [ # 统一列表头样式 {"selector": "thead th", "props": "background-color:yellow; color:black; border:1px solid black; text-align:left"}, # 调整索引名样式,使其与列表头对齐 {"selector": "th.index_name", "props": "background-color:yellow; border:1px solid black; text-align:left; padding: 0.5em;"}, # 消除索引行与上方的空隙 {"selector": "tbody tr:first-child th", "props": "border-top: 1px solid black;"}, # 合并表格边框,消除多余空行 {"selector": "table, thead", "props": "border-collapse: collapse;"} ] data = np.random.rand(4,4) columns = pd.MultiIndex.from_product([["A","B"],["C","D"]]) index = pd.MultiIndex.from_product([["x","y"],["1","2"]]) df = pd.DataFrame(data, columns=columns, index=index) df.rename_axis(["index1","index2"], inplace=True) # 应用样式 styled_df = df.style.set_properties(**style_valeurs).set_table_styles(style_col) styled_df
核心调整说明:
- 针对
th.index_name选择器设置样式,让索引名拥有和列表头一致的黄色背景与边框,通过padding调整位置使其上移 - 启用
border-collapse: collapse彻底消除表格内的空隙和空行 - 调整第一行索引的上边框,确保和索引名区域无缝衔接
2. 导出为PNG格式
Pandas样式对象无法直接导出为PNG,需先转为HTML再转成图片,这里推荐使用imgkit工具:
步骤1:安装依赖
pip install imgkit # 额外安装wkhtmltopdf: # Windows:下载安装包并添加到系统环境变量(官网:wkhtmltopdf.org) # Linux:sudo apt-get install wkhtmltopdf # Mac:brew install wkhtmltopdf
步骤2:执行导出
# 将样式化DataFrame转为HTML字符串 html_content = styled_df.render() # 转换并保存为PNG import imgkit imgkit.from_string(html_content, "df_output.png")
如果不想用imgkit,也可以用Matplotlib手动绘制表格(代码相对繁琐,但无需额外依赖除Matplotlib外的工具):
import matplotlib.pyplot as plt from matplotlib.table import Table # 设置画布大小 fig, ax = plt.subplots(figsize=(8, 3)) ax.axis('off') # 整理表格数据与表头 table_data = [df.columns.get_level_values(0).tolist(), df.columns.get_level_values(1).tolist()] + df.reset_index().values.tolist() index_names = ['index1', 'index2'] # 创建表格对象 table = Table(ax, bbox=[0, 0, 1, 1]) row_height = 0.1 col_widths = [0.15, 0.15, 0.2, 0.2, 0.2, 0.2] # 添加索引名单元格 for col, name in enumerate(index_names): table.add_cell(0, col, width=col_widths[col], height=row_height, text=name, facecolor='yellow', edgecolor='black', loc='left') # 添加列表头单元格 # 第一层列表头(A、B) table.add_cell(0, 2, width=col_widths[2]+col_widths[3], height=row_height, text='A', facecolor='yellow', edgecolor='black', loc='center') table.add_cell(0, 4, width=col_widths[4]+col_widths[5], height=row_height, text='B', facecolor='yellow', edgecolor='black', loc='center') # 第二层列表头(C、D) for col, val in enumerate(df.columns.get_level_values(1)): table.add_cell(1, col+2, width=col_widths[col+2], height=row_height, text=val, facecolor='yellow', edgecolor='black', loc='left') # 添加数据行与索引行 for row_idx in range(2, len(table_data)): row = table_data[row_idx] # 添加索引列 for col in range(2): table.add_cell(row_idx, col, width=col_widths[col], height=row_height, text=str(row[col]), facecolor='white', edgecolor='black', loc='left') # 添加数据列 for col in range(2, len(row)): table.add_cell(row_idx, col+2, width=col_widths[col+2], height=row_height, text=f"{row[col]:.4f}", facecolor='white', edgecolor='black', loc='left') ax.add_table(table) # 保存图片,设置高DPI保证清晰度 plt.savefig("df_output_matplotlib.png", bbox_inches='tight', dpi=300) plt.close()
内容的提问来源于stack exchange,提问作者Sabrina
相关产品推荐
相关产品推荐

