如何遍历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
相关产品推荐
相关产品推荐

