如何基于Pandas DataFrame布尔列生成映射后的分类列
问题描述
现有如下Pandas DataFrame:
import pandas as pd data = {'book': [True, False, False, False, False], 'apple': [False, False, True, False, False], 'cat': [False, False, False, False, True], 'pigeon': [False, True, False, False, False], 'shirt': [False, False, False, True, False]} df = pd.DataFrame(data)
需要创建新列df['category'],将每行中值为True的列名映射为对应的分类,映射规则如下:
book - stationery, apple - fruit, cat - animal, pigeon - bird, shirt - clothes
已知每行仅有一列值为True,预期输出如下:
>>> df book apple cat pigeon shirt category 0 True False False False False stationery 1 False False False True False bird 2 False True False False False fruit 3 False False False False True clothes 4 False False True False False animal
解决方案
方法1:idxmax() + map()(推荐,效率最高)
利用idxmax(axis=1)直接获取每行中值为True的列名,再通过预定义的字典完成分类映射:
# 定义分类映射字典 category_map = { 'book': 'stationery', 'apple': 'fruit', 'cat': 'animal', 'pigeon': 'bird', 'shirt': 'clothes' } # 生成新列 df['category'] = df.idxmax(axis=1).map(category_map)
方法2:melt() + 合并
将宽表转为长表后筛选出值为True的记录,再合并回原DataFrame:
category_map = { 'book': 'stationery', 'apple': 'fruit', 'cat': 'animal', 'pigeon': 'bird', 'shirt': 'clothes' } # 转换为长表并筛选有效行 melted_df = df.reset_index().melt(id_vars='index', var_name='item', value_name='flag') valid_rows = melted_df[melted_df['flag']].drop('flag', axis=1) # 添加分类列 valid_rows['category'] = valid_rows['item'].map(category_map) # 合并回原表 df = df.merge(valid_rows, left_index=True, right_on='index').drop('index', axis=1)
方法3:apply()逐行处理
逻辑直观但效率较低,适合小数据集:
category_map = { 'book': 'stationery', 'apple': 'fruit', 'cat': 'animal', 'pigeon': 'bird', 'shirt': 'clothes' } # 逐行找到True对应的列名并映射 df['category'] = df.apply(lambda row: category_map[row[row].index[0]], axis=1)
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

