如何手动排序多层索引DataFrame并按聚类分组展示(去缺失值)
如何整理DataFrame实现去缺失值并按聚类分组展示
问题描述
原始DataFrame示例:
a b _____________ 0 1 1.1 1 2 1.2 2 3 2.1 3 NaN 2.2 4 NaN 2.3 5 NaN 3.1 6 NaN 3.2 7 NaN 3.3 8 NaN 3.4
需求:去除缺失值显示,按聚类分组排序,最终展示形式如下:
a b _____________ 1 1.1 1.2 __________ 2 2.1 2.2 2.3 __________ 3 3.1 3.2 3.3 3.4
解决方案
步骤1:填充缺失值实现分组
首先用**前向填充(ffill)**处理列a的缺失值,将每个NaN替换为最近的非NaN值,这样就能把后续行归到对应的组中。
步骤2:分组并自定义展示格式
通过分组后手动拼接输出内容,或者用Pandas的Styler做可视化格式化,以下是两种实现方式:
方式1:手动生成自定义格式输出
适合需要纯文本输出的场景:
import pandas as pd import numpy as np # 创建示例DataFrame df = pd.DataFrame({ 'a': [1, 2, 3, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], 'b': [1.1, 1.2, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3, 3.4] }) # 前向填充缺失值 df['a'] = df['a'].ffill() # 按a值分组 groups = df.groupby('a') # 构建输出内容 output = " a b\n _____________\n" for idx, (group_key, group_df) in enumerate(groups): # 组之间添加分隔线(跳过第一个组) if idx > 0: output += " __________\n" # 遍历组内每行,仅第一行显示a值 for row_idx, row in enumerate(group_df.itertuples(index=False)): a_display = f" {row.a}" if row_idx == 0 else " " output += f"{a_display} {row.b}\n" # 打印结果 print(output)
方式2:用Pandas Styler实现可视化展示
适合在Jupyter Notebook等交互式环境中展示:
import pandas as pd import numpy as np df = pd.DataFrame({ 'a': [1, 2, 3, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], 'b': [1.1, 1.2, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3, 3.4] }) def format_grouped_df(df): # 复制DataFrame并填充缺失值 df_filled = df.copy() df_filled['a'] = df_filled['a'].ffill() # 创建用于展示的a列,每组仅保留第一个值 df_filled['display_a'] = df_filled.groupby('a')['a'].apply(lambda x: [x.iloc[0]] + ['']*(len(x)-1)) df_filled = df_filled.explode('display_a') # 调整列顺序并重命名 df_display = df_filled[['display_a', 'b']].rename(columns={'display_a': 'a'}) # 设置表格样式 return df_display.style.set_table_styles([ # 隐藏重复的索引 {'selector': 'tr:nth-child(n+2) th', 'props': [('display', 'none')]}, # 组内非首行的a列内容隐藏 {'selector': 'tbody tr:not(:first-child) td:first-child', 'props': [('visibility', 'hidden')]} ]).set_caption("分组后的DataFrame展示") # 展示格式化后的表格 format_grouped_df(df)
代码说明
ffill():核心是用前向填充把缺失的组标识补全,确保后续能正确分组。- 手动输出方式:通过循环分组结果,控制每行的a值显示与否,同时添加组分隔线,完全匹配需求的展示格式。
- Styler方式:利用Pandas的样式功能,通过CSS规则控制元素可见性,在交互式环境中更美观。
内容的提问来源于stack exchange,提问作者MohamedJihed Riahi
相关产品推荐
相关产品推荐

