You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动排序多层索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:55