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

如何遍历MultiIndex Pandas DataFrame按指定索引层级归一化

解决MultiIndex DataFrame的分组归一化问题

我来帮你搞定这个需求!针对带MultiIndex行索引的Pandas DataFrame,要对每个Thing分组下的Norm1和Norm2列按两者的最大值归一化,完全不用写繁琐的遍历逻辑,用Pandas的分组和广播机制就能高效实现,还能完整保留原有的索引和列名结构。

先明确数据结构(按你的描述还原)

假设你的DataFrame行索引是Level1+Level2的MultiIndex,列是按Thing分组的:要么是多层列索引(第一层为Thing名称,第二层为Norm1/Norm2),要么是普通列名(格式如ThingX_NormY)。下面分情况给出解决方案:


情况1:列是MultiIndex格式

如果你的列是('Thing1', 'Norm1')、('Thing1', 'Norm2')这类多层结构,直接按列的第一层(Thing分组)计算最大值,再广播归一化:

import pandas as pd

# 假设你的DataFrame名为df
# 1. 按列的第一层(Thing)分组,计算每组内Norm1和Norm2的最大值(每行对应一个最大值)
max_per_thing = df.groupby(level=0, axis=1).max()

# 2. 将最大值对齐到原列结构,执行归一化
normalized_df = df / max_per_thing.reindex(df.columns, level=0, axis=1)

情况2:列是普通索引(如Thing1_Norm1)

如果列名是普通字符串,先提取Thing分组标识,再按分组计算最大值:

import pandas as pd

# 1. 从列名中提取Thing分组(比如拆分下划线取第一部分)
thing_groups = df.columns.str.split('_').str[0]

# 2. 按Thing分组计算每组的最大值
max_per_thing = df.groupby(thing_groups, axis=1).max()

# 3. 对齐列并归一化
normalized_df = df / max_per_thing.reindex(thing_groups, axis=1)

如果需要按行的第二索引层级(Level2)分组处理

如果你是要对每个Level2层级内部的每个Thing列做归一化,那就再套一层行分组:

# 按行的第二层级(Level2)分组,对每个组内的数据执行归一化
normalized_df = df.groupby(level=1, axis=0).apply(
    lambda group: group / group.groupby(level=0, axis=1).max().reindex(group.columns, level=0, axis=1)
)

为什么不用遍历?

Pandas的矢量化操作比手动遍历快得多,尤其是数据量较大的时候,而且这种方法会自动保留所有原有的索引(包括MultiIndex)和列名结构,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:06