求助:将长格式DataFrame按用户名重塑为宽格式的问题
解决DataFrame按frame汇总用户标签的宽格式重塑问题
核心解决方案
根据需求调整索引参数,移除不需要的image_id即可。如果存在同一task+frame+username组合下的重复标签数据,需用pivot_table配合聚合函数处理。
情况1:无重复标签(每个用户在同一frame下仅一个标签)
直接修改索引,只保留task和frame:
pd.pivot(df, index=['task', 'frame'], columns='username', values='label')
情况2:存在重复标签(同一frame下用户有多个标签)
使用pivot_table指定聚合逻辑,例如取第一个标签:
pd.pivot_table(df, index=['task', 'frame'], columns='username', values='label', aggfunc='first')
或者将所有标签合并为列表:
pd.pivot_table(df, index=['task', 'frame'], columns='username', values='label', aggfunc=lambda x: list(x))
结果示例
以你提供的测试数据为例,运行第一种代码会得到如下无image_id字段的宽格式结果:
username jery tom task frame task_1 0 foo foo 8 xyz NaN 9 NaN bar 11 bar bar
原因说明
原代码将image_id加入行索引,导致结果保留了这个唯一标识字段。按frame汇总的需求仅需以task和frame作为分组依据,因此移除image_id即可得到目标格式。如果存在重复数据,pivot会因索引+列的组合不唯一报错,pivot_table则可通过聚合函数处理重复值。
内容的提问来源于stack exchange,提问作者TeoK
相关产品推荐
相关产品推荐

