如何用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 ID | Item |
|---|---|
| 1001 | Apples |
| 1001 | Bananas |
| 1002 | Oranges |
| 1002 | Bananas |
| 1003 | Apples |
| 1003 | Oranges |
| 1003 | Grapes |
| ... | ... |
内容的提问来源于stack exchange,提问作者iamlearningmath
相关产品推荐
相关产品推荐

