Pandas基于hurdle_lvl列行转列并保留offer_id映射的实现方法
你出现这个问题的核心原因是透视时没有把offer_id加入索引维度,同时cumcount的分组键设置错误,才会丢失offer_id和透视结果的映射关系。以下是可直接得到目标格式的代码:
import pandas as pd # 第一步:给每个offer_id内部的行生成序号,对应hurdle_1/hurdle_2/hurdle_3的后缀 df['seq'] = df.groupby('offer_id').cumcount() + 1 # 第二步:执行透视,index设为offer_id,列用生成的序号,值取hurdle和reward_value pivot_df = df.pivot( index='offer_id', columns='seq', values=['hurdle', 'reward_value'] ).reset_index() # 第三步:合并多层列名,调整为你需要的格式 pivot_df.columns = [ f'{col[0]}_{col[1]}' if col[1] != '' else col[0] for col in pivot_df.columns.to_flat_index() ] # 第四步:重置索引,得到最终结果 pivot_df = pivot_df.reset_index(drop=True)
如果你的业务逻辑要求严格按照hurdle_lvl字段的值作为列后缀,同一个offer_id存在重复hurdle_lvl时指定聚合规则即可,示例如下:
pivot_df = df.pivot_table( index='offer_id', columns='hurdle_lvl', values=['hurdle', 'reward_value'], aggfunc='max' # 可根据需求替换为first/sum/mean等聚合函数 ).reset_index() # 同样调整列名即可 pivot_df.columns = [ f'{col[0]}_{col[1]}' if col[1] != '' else col[0] for col in pivot_df.columns.to_flat_index() ] pivot_df = pivot_df.reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Fizi
相关产品推荐
相关产品推荐

