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

