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

如何根据DataFrame布尔列列名生成含重复行的新DataFrame?

Pandas 布尔列展开为行的实现方案

需求说明

给定包含布尔列(A、B、C、D)和其他字段(如X)的DataFrame,需要将每个行中布尔值为True的列名提取为新的Type列,同时保留原字段值,生成对应重复行的结果表。

示例数据构造

import pandas as pd

df = pd.DataFrame({
    'A': [True, False, False],
    'B': [True, True, False],
    'C': [False, False, True],
    'D': [True, False, True],
    'X': [0.1, 0.2, 0.3]
})

方法一:使用melt + 筛选(推荐,适配多保留字段场景)

# 定义需要保留的非布尔字段(可扩展为多个,比如['X', 'Y', 'Z'])
keep_cols = ['X']
# 布尔列列表
bool_cols = ['A', 'B', 'C', 'D']

# 转换为长格式,保留目标字段,新增Type和Flag列存储原布尔值
melted_df = df.melt(id_vars=keep_cols, var_name='Type', value_name='Flag', value_vars=bool_cols)
# 筛选Flag为True的行,删除Flag列得到结果
result = melted_df[melted_df['Flag']].drop('Flag', axis=1).reset_index(drop=True)

print(result)

输出结果:

X Type
0  0.1    A
1  0.1    B
2  0.1    D
3  0.2    B
4  0.3    C
5  0.3    D

如果需要保留原数据的行索引,可先将索引转为列再处理:

df_with_idx = df.reset_index().rename(columns={'index': 'Original_Index'})
melted_df = df_with_idx.melt(id_vars=['Original_Index'] + keep_cols, var_name='Type', value_name='Flag', value_vars=bool_cols)
result = melted_df[melted_df['Flag']].drop('Flag', axis=1)

print(result)

输出结果:

Original_Index    X Type
0               0  0.1    A
1               0  0.1    B
3               0  0.1    D
4               1  0.2    B
7               2  0.3    C
9               2  0.3    D

方法二:使用stack

# 提取布尔列并转为行结构
stacked = df[bool_cols].stack()
# 筛选布尔值为True的行,将二级索引转为Type列
filtered = stacked[stacked].reset_index(level=1).rename(columns={'level_1': 'Type'})
# 合并原数据的保留字段
result = filtered.join(df[keep_cols]).reset_index(drop=False).rename(columns={'index': 'Original_Index'})

print(result)

该方法通过将布尔列转为二级索引,筛选后与原数据字段合并,最终结果与方法一一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:45:08