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

如何将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结合过滤实现需求,步骤清晰且高效:

  1. 使用melt将横向的选项列(option1-option4)转为纵向行,同时保留Region、Store Name、profit作为标识列
  2. 过滤出标识为Y的行
  3. 清理冗余列并调整列顺序

完整代码如下:

# 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:46:07