如何在Pandas中单独存储DataFrame多层分组结果并用于HTML表格展示
如何在Pandas中单独存储DataFrame多层分组结果并用于HTML表格展示
嘿,我完全懂你想要的效果——把多层分组后的每个子结果单独拎出来,再做成结构化的层级式HTML表格展示对吧?我来一步步教你怎么实现:
首先,先把你的示例数据在Pandas里还原出来,确保我们的数据源完全匹配:
import pandas as pd # 构造你的示例DataFrame data = { 'university': [ 'Evergreen College', 'Evergreen College', 'Evergreen College', 'Cascade University', 'Cascade University', 'Horizon Institute', 'Horizon Institute' ], 'country': ['USA', 'USA', 'Swiss', 'CANADA', 'CANADA', 'FRANCE', 'FRANCE'], 'sector': ['URO', 'URO', 'URO', 'DIG', 'VIP', 'MP', 'MP'], 'name': ['Isabel', 'Rami', 'Johnson', 'Anthony', 'Michael', 'Ben', 'Benjamin'], 'firstname': ['Emily', 'David', 'Parker', 'Jessica', 'Thierry', 'Samuel', 'John'], 'code': ['694123', '63123', '114196', '55177', '124199', '25896', '52366'] } df = pd.DataFrame(data)
接下来,我们用groupby做三层嵌套分组:university(大学)→ country(国家)→ sector(部门),然后把每个分组的结果单独存到字典里,这样你之后想调用任何一个分组都能直接拿到对应的子DataFrame,完全满足你“单独获取每个分组”的需求:
# 按指定列进行多层分组 grouped = df.groupby(['university', 'country', 'sector']) # 创建字典存储所有分组结果:键是(大学, 国家, 部门)的元组,值是对应子DataFrame group_results = {} for group_keys, group_df in grouped: # 重置索引,避免原DataFrame的索引干扰 group_results[group_keys] = group_df.reset_index(drop=True)
现在你可以随时调用任何一个分组了!比如想拿Evergreen College下USA地区的URO部门数据,直接写group_results[('Evergreen College', 'USA', 'URO')]就能得到对应的子表格,非常方便。
接下来就是生成你想要的层级化HTML展示了。我们可以把分组结果按大学→国家→部门的层级重新整理,然后拼接成带标题缩进的HTML内容,完美匹配你想要的展示效果:
# 生成层级化的HTML内容 html_output = '<div style="padding: 20px; font-family: Arial, sans-serif;">' # 先按大学层级重新整理分组,方便按顺序展示 university_level_groups = {} for (uni, country, sector), sub_df in group_results.items(): if uni not in university_level_groups: university_level_groups[uni] = {} if country not in university_level_groups[uni]: university_level_groups[uni][country] = {} university_level_groups[uni][country][sector] = sub_df # 遍历每所大学,拼接HTML for uni_name, country_dict in university_level_groups.items(): html_output += f'<h3 style="color: #2c3e50; margin-top: 15px;">{uni_name}</h3>' # 遍历大学下的每个国家 for country_name, sector_dict in country_dict.items(): html_output += f'<h4 style="margin-left: 20px; color: #34495e;">{country_name}</h4>' # 遍历国家下的每个部门 for sector_name, sub_df in sector_dict.items(): html_output += f'<h5 style="margin-left: 40px; color: #7f8c8d;">{sector_name}</h5>' # 将子DataFrame转为HTML表格,添加样式 table_html = sub_df.to_html( index=False, border=0, justify='left' ) # 给表格添加缩进和间距样式 html_output += f'<div style="margin-left: 60px; margin-bottom: 25px;">{table_html}</div>' # 关闭最外层容器 html_output += '</div>' # 可选:把HTML内容保存到本地文件查看效果 with open('grouped_university_tables.html', 'w', encoding='utf-8') as f: f.write(html_output)
运行这段代码后,打开生成的grouped_university_tables.html文件,就能看到和你需求完全一致的效果:每所大学作为一级标题,下面缩进显示对应的国家,再缩进显示部门,每个部门下面就是对应的学生数据表格。
如果想让表格更美观,还可以给HTML加一点CSS样式。比如在最外层div前加上这段样式:
<style> .group-table { border-collapse: collapse; width: 80%; box-shadow: 0 2px 3px rgba(0,0,0,0.1); } .group-table th, .group-table td { border: 1px solid #ddd; padding: 10px; text-align: left; } .group-table th { background-color: #f8f9fa; font-weight: bold; } </style>
然后在to_html方法里加上classes='group-table'参数,表格就会自动应用这个样式啦!
备注:内容来源于stack exchange,提问作者innov-aphp
相关产品推荐
相关产品推荐

