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

如何将单索引Pandas DataFrame转换为多级索引并分组相同索引行

实现Pandas多级索引分组显示(重复索引单元格空白)

问题描述

现有如下Pandas DataFrame:

import pandas as pd

# 创建DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'Alice', 'Carol', 'Alice', 'Carol', 'Matt'],
                   'Address': ['123 A St', '123 B St', '123 C St', '123 A St', '123 C St', '456 X St', '123 C St', '123 M St'],
                   'State': ['AZ', 'TX', 'CA', 'AZ', 'CA', 'AZ', 'CA', 'MA'],
                   'Car': ['GMC', 'Mazda', 'Tesla', 'Honda', 'Nissan', 'Subaru', 'Mazda', 'Buick'],
                   'Miles': [1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888]})

# 显示原始数据
display(df)

目标是将其转换为以Name、Address、State为多级索引的DataFrame,实现相同多级索引的行分组显示(重复索引的单元格显示为空,如示例表格样式)。尝试使用df = df.set_index(keys=['Name', 'Address', 'State'])无法实现该效果,需解决此问题。

解决方案

要实现这种分组显示效果,核心是让重复的索引值在显示时为空,推荐使用**Pandas样式(Styler)**实现,该方式仅调整显示效果,不会修改原始数据:

方法1:使用Styler格式化索引(推荐)

import pandas as pd

# 创建DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'Alice', 'Carol', 'Alice', 'Carol', 'Matt'],
                   'Address': ['123 A St', '123 B St', '123 C St', '123 A St', '123 C St', '456 X St', '123 C St', '123 M St'],
                   'State': ['AZ', 'TX', 'CA', 'AZ', 'CA', 'AZ', 'CA', 'MA'],
                   'Car': ['GMC', 'Mazda', 'Tesla', 'Honda', 'Nissan', 'Subaru', 'Mazda', 'Buick'],
                   'Miles': [1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888]})

# 设置多级索引
df_indexed = df.set_index(['Name', 'Address', 'State'])

# 定义格式化逻辑:重复的索引值显示为空
prev_name = set()
prev_addr = set()
prev_state = set()

def format_index(val, tracker):
    if val in tracker:
        return ''
    tracker.add(val)
    return val

# 对每一级索引应用格式化规则
styled_df = df_indexed.style.format_index(
    lambda x: format_index(x, prev_name), level=0
).format_index(
    lambda x: format_index(x, prev_addr), level=1
).format_index(
    lambda x: format_index(x, prev_state), level=2
)

# 显示样式化后的表格
display(styled_df)

方法2:修改数据实现显示效果(不推荐)

如果需要直接修改数据让索引显示为空字符串,可按以下步骤操作(会改变原始索引值,后续索引操作可能受影响):

import pandas as pd

# 创建DataFrame
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Carol', 'Alice', 'Carol', 'Alice', 'Carol', 'Matt'],
                   'Address': ['123 A St', '123 B St', '123 C St', '123 A St', '123 C St', '456 X St', '123 C St', '123 M St'],
                   'State': ['AZ', 'TX', 'CA', 'AZ', 'CA', 'AZ', 'CA', 'MA'],
                   'Car': ['GMC', 'Mazda', 'Tesla', 'Honda', 'Nissan', 'Subaru', 'Mazda', 'Buick'],
                   'Miles': [1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888]})

# 重置索引为列,处理重复值
df_temp = df.copy()
# 仅保留每组第一个索引值,其余重复项设为空字符串
df_temp[['Name', 'Address', 'State']] = df_temp[['Name', 'Address', 'State']].where(
    ~df_temp.duplicated(subset=['Name', 'Address', 'State'], keep='first'), ''
)

# 重新设置多级索引
df_final = df_temp.set_index(['Name', 'Address', 'State'])

# 显示结果
display(df_final)

说明

  • 方法1通过Styler功能仅调整显示样式,不修改原始数据索引,是更安全的常规做法。
  • 方法2直接修改数据内容,会导致索引中出现空字符串,仅适用于无需保留原始索引值的特殊场景。

内容的提问来源于stack exchange,提问作者BGG16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:36:01