如何用Pandas实现两列DataFrame的层级式单列输出(含折叠高亮)
问题:将Pandas DataFrame转换为层级式单列格式并实现高亮与折叠功能
原始DataFrame
| Unnamed: 0 | Unnamed: 1 |
|---|---|
| B | b |
| C | b |
| D | b |
| E | c |
| F | c |
期望输出格式
| content |
|---|
| b |
| B |
| C |
| D |
| c |
| E |
| F |
要求实现:
- 小写字母行高亮
- 支持展开/折叠小写字母对应的下方内容
你尝试用pivot_table得到的是合并后的两列结果,不符合需求,以下是纯Pandas的解决方案:
解决方案
1. 读取/构造数据(替换为你的Excel读取逻辑)
import pandas as pd # 替换为你的实际读取代码 # df = pd.read_excel(r'xxxxx.xlsx')[['Unnamed: 0','Unnamed: 1']] data = { 'Unnamed: 0': ['B', 'C', 'D', 'E', 'F'], 'Unnamed: 1': ['b', 'b', 'b', 'c', 'c'] } df = pd.DataFrame(data)
2. 生成带折叠功能的层级式单列结构
通过分组遍历,先添加分组标签行,再添加组内内容行,同时设置多级索引来触发Jupyter Notebook的原生折叠功能:
result_data = [] # 按分组键遍历,保留原始数据顺序 for group_key, group_df in df.groupby('Unnamed: 1', sort=False): # 添加分组标签行(作为折叠的父节点) result_data.append((group_key, '')) # 添加组内的每个内容行 for item in group_df['Unnamed: 0']: result_data.append((group_key, item)) # 转换为带多级索引的DataFrame result_df = pd.DataFrame( [row[1] if row[1] != '' else row[0] for row in result_data], columns=['content'], index=pd.MultiIndex.from_tuples(result_data, names=['分组标签', '子项']) )
3. 实现小写字母行高亮
使用Pandas的Styler工具给分组标签行(小写字母)添加高亮样式:
def highlight_group_label(row): # 通过多级索引判断是否为分组标签行 if row.name[1] == '': return ['background-color: #fff2cc'] # 浅黄高亮,可自定义颜色 return [''] # 应用样式 styled_result = result_df.style.apply(highlight_group_label, axis=1)
效果说明
- 在Jupyter Notebook中,带多级索引的
result_df会自动显示折叠按钮,点击b或c即可展开/折叠对应的子项。 - 高亮样式会给分组标签行添加背景色,清晰区分层级。
- 如果不需要折叠功能,可简化为普通单列结构:
result_rows = [] for group_key, group_df in df.groupby('Unnamed: 1', sort=False): result_rows.append(pd.Series([group_key], columns=['content'])) result_rows.append(group_df.rename(columns={'Unnamed: 0': 'content'})[['content']]) result_df = pd.concat(result_rows, ignore_index=True)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

