如何将DataFrame横向选项转为纵向并保留Y对应数据?
问题描述
现有如下结构的Pandas DataFrame,包含区域、门店名称、多个带Y/N标识的选项列,以及对应利润值:
import pandas as pd # 原始DataFrame示例 df = pd.DataFrame({ 'Region': ['Region 1', 'Region 1', 'Region 1', 'Region 2', 'Region 2', 'Region 2'], 'Store Name': ['Store 1', 'Store 2', 'Store 3', 'Store 4', 'Store 5', 'Store 6'], 'option1': ['Y', 'N', 'N', 'N', 'N', 'N'], 'option2': ['Y', 'Y', 'Y', 'Y', 'Y', 'Y'], 'option3': ['N', 'N', 'N', 'N', 'N', 'N'], 'option4': ['N', 'Y', 'Y', 'Y', 'Y', 'Y'], 'profit': [48.1575, 74.7667, 102.35, 114.59, 99.705, 105.07] })
需求是将其转换为纵向格式:仅保留标识为Y的选项,每个保留的选项对应原行的profit值,最终输出结构如下:
Region Store Name options profit 0 Region 1 Store 1 option1 48.1575 1 Region 1 Store 1 option2 48.1575 2 Region 1 Store 2 option2 74.7667 3 Region 1 Store 2 option4 74.7667 ...
当前尝试的代码无法适配场景:
e1 = pd.melt(sales_dist_e, id_vars=['Area', 'Store Name'], var_name='option').set_index(['Area', 'Store Name', 'optionx']).squeeze().unstack().reset_index()
解决方案
可以通过pd.melt结合过滤实现需求,步骤清晰且高效:
- 使用
melt将横向的选项列(option1-option4)转为纵向行,同时保留Region、Store Name、profit作为标识列 - 过滤出标识为
Y的行 - 清理冗余列并调整列顺序
完整代码如下:
# 1. 转换为纵向格式,保留关键标识列 melted_df = pd.melt( df, id_vars=['Region', 'Store Name', 'profit'], var_name='options', value_name='status' ) # 2. 只保留status为Y的记录 result_df = melted_df[melted_df['status'] == 'Y'] # 3. 移除冗余的status列,调整列顺序与期望结果一致 result_df = result_df[['Region', 'Store Name', 'options', 'profit']].reset_index(drop=True) print(result_df.head())
代码说明
id_vars指定转换时保持不变的列,这里必须包含profit才能让每个选项对应正确的利润值var_name设置转换后选项列的名称,value_name存储原Y/N标识- 过滤操作直接筛选出需要的
Y记录,避免后续处理无效数据 - 最后重置索引并调整列顺序,匹配期望输出格式
内容的提问来源于stack exchange,提问作者Aeternis
相关产品推荐
相关产品推荐

