如何在Pandas中将隔行转为列并以下一行作为对应值?
Pandas DataFrame 产品类型转宽表解决方案
原始数据
import pandas as pd df = pd.DataFrame.from_dict({'type': {4: 'Second Product', 5: 'table', 6: 'First Product', 7: 'chair', 8: 'Second Product', 9: 'desk', 10: 'First Product', 11: 'chair'}, 'id': {4: 'cust1', 5: 'cust1', 6: 'cust1', 7: 'cust1', 8: 'cust2', 9: 'cust2', 10: 'cust2', 11: 'cust2'}})
转换代码
# 按客户分组,将每组内的产品名与对应值配对 result = df.groupby('id').apply(lambda x: pd.Series(dict(zip(x['type'].iloc[::2], x['type'].iloc[1::2])))).reset_index() # 重命名id列为cust,匹配目标格式 result.rename(columns={'id': 'cust'}, inplace=True)
代码说明
- 分组处理:通过
groupby('id')将同一客户的行归为一组,确保每个客户的产品名和对应值在同一组内处理 - 键值配对:每组内的
type列按顺序是「产品名→对应值→产品名→对应值」的结构,用iloc[::2]提取所有产品名作为键,iloc[1::2]提取对应位置的值,通过zip配对成字典后转为Series - 格式调整:
reset_index()将分组的客户id转为列,最后重命名列名匹配需求
该方案自动适配任意数量的产品类型,若某客户缺少对应产品,对应列会自动填充NaN。
内容的提问来源于stack exchange,提问作者user3486773
相关产品推荐
相关产品推荐

