如何将Pandas crosstab生成的DataFrame表头调整为双层结构?
实现Pandas双层表头的解决方案
使用Pandas的crosstab函数生成DataFrame,添加Total列和Percentage列后,通过to_html()转换为表格时,表头格式不符合需求。当前代码如下:
out = pd.crosstab(df1['lurn_FLS'], df1['LOCALITY']) out['Total'] = out.sum(axis=1) total_sum = out['Total'].sum() out['Percentage'] = ((out['Total']/total_sum) *100).round(2) print(out)
需要将表头调整为双层结构,预期格式如下:
| Locality | ||||
|---|---|---|---|---|
| lurn_fls | mbn:match_both_non-empty | xne:mismatch neither empty | Total | Percentage |
| -------- | ------------------------- | -------------------------- | ------ | ------------ |
| 1 | 210 | 300 | 510 | 21 |
| 2 | 310 | 400 | 710 | 50 |
要实现这种双层表头,需要利用Pandas的多层列索引(MultiIndex),具体步骤如下:
重置索引,将行索引转为普通列
原crosstab生成的DataFrame中,lurn_FLS是行索引,需先转为普通列,方便后续构造双层表头:out = out.reset_index().rename(columns={'lurn_FLS': 'lurn_fls'})构造双层列索引
定义上下层表头的对应关系,通过pd.MultiIndex.from_tuples绑定生成多层索引:# 上层表头:第一列对应"Locality",其余列留空 upper_headers = ['Locality', '', '', '', ''] # 下层表头直接使用当前DataFrame的列名 lower_headers = out.columns.tolist() # 绑定上下层表头,生成多层列索引 out.columns = pd.MultiIndex.from_tuples(list(zip(upper_headers, lower_headers)))生成HTML表格
此时调用to_html()会自动输出带双层表头的表格结构:html_table = out.to_html(index=False)
完整代码示例:
import pandas as pd # 生成交叉表并添加合计、百分比列 out = pd.crosstab(df1['lurn_FLS'], df1['LOCALITY']) out['Total'] = out.sum(axis=1) total_sum = out['Total'].sum() out['Percentage'] = ((out['Total']/total_sum) *100).round(2) # 重置索引并调整列名 out = out.reset_index().rename(columns={'lurn_FLS': 'lurn_fls'}) # 构造双层表头 upper_headers = ['Locality', '', '', '', ''] lower_headers = out.columns.tolist() out.columns = pd.MultiIndex.from_tuples(list(zip(upper_headers, lower_headers))) # 生成HTML表格 html_table = out.to_html(index=False) print(html_table)
内容的提问来源于stack exchange,提问作者Ashu
相关产品推荐
相关产品推荐

