Pandas:如何将多列互斥年龄分组标识转换为单列年龄分组标签
Pandas多列互斥标签合并为单列的最优实现方案
核心实现(最高效简洁)
利用idxmax矢量化操作,直接提取每行最大值对应的列名,完美适配「每行仅一个1、分组互斥」的场景:
import pandas as pd # 假设你的原始DataFrame变量名为df # 提取年龄分组列做行维度最大值索引匹配,直接生成目标列 df["age_group"] = df[["21_30", "31_40", "40_49", "50_59"]].idxmax(axis=1) # 如果仅需要保留age_group单列,可直接生成新结果表 df_result = df[["age_group"]]
方案说明
- 该方法是Pandas原生矢量化操作,无额外循环开销,数据量越大性能优势越明显
- 可读性高,逻辑直观:因为每行仅存在一个值为1的列,最大值的索引恰好对应需要的分组名称
- 如果需要提前校验数据是否符合「分组互斥、每行仅一个分组」的规则,可以加一行校验逻辑:
# 校验所有行的分组标记和为1,避免全0/多1的异常数据 assert (df[["21_30", "31_40", "40_49", "50_59"]].sum(axis=1) == 1).all(), "存在不符合互斥规则的异常行"
备选实现
也可以用矩阵点积的方式实现,性能和上述方案相当:
df["age_group"] = df[["21_30", "31_40", "40_49", "50_59"]].dot(df.columns)
内容的提问来源于stack exchange,提问作者Alf
相关产品推荐
相关产品推荐

