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

如何用Pandas将指定列名转为行值实现数据行扩展?

解决Pandas宽表转长表(仅保留Yes项)的正确方法

核心思路

先通过melt将宽格式数据转为长格式,再过滤出值为Yes的记录,最后清理冗余列即可得到目标格式。

分步实现代码

1. 导入库并处理原始数据

import pandas as pd

# 替换为你自己的数据集读取代码,比如:
# df = pd.read_csv('your_dataset.csv')

# 以下为模拟示例(可忽略)
data = {
    'CUSTOMER ID': range(1001, 1011),
    'Apples': ['Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'Yes', 'No'],
    'Oranges': ['No', 'Yes', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'No', 'Yes'],
    'Bananas': ['Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No'],
    'Grapes': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'Yes'],
}
df = pd.DataFrame(data)

2. 使用melt转换长格式

# 固定CUSTOMER ID为标识列,将商品列转为Item行记录
melted_df = df.melt(
    id_vars='CUSTOMER ID',
    var_name='Item',
    value_name='Purchase'
)

3. 过滤并清理数据

# 仅保留购买状态为Yes的记录,删除冗余的Purchase列
final_df = melted_df[melted_df['Purchase'] == 'Yes'].drop('Purchase', axis=1)

# 可选:按客户ID排序,让结果更规整
final_df = final_df.sort_values('CUSTOMER ID').reset_index(drop=True)

常见错误排查

  • 未指定var_name/value_name:转换后列名混乱,导致后续过滤逻辑出错
  • 遗漏过滤步骤:直接保留了所有Yes/No记录,未得到仅含Yes的目标结果
  • 未删除冗余列:最终结果仍保留Purchase列,不符合需求格式

最终结果示例

CUSTOMER IDItem
1001Apples
1001Bananas
1002Oranges
1002Bananas
1003Apples
1003Oranges
1003Grapes
......

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:13