pandas 将 Dataframe 从长到宽重新整形

l3zydbqr  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(139)

我的DF:

d = {'project_id': [19,20,19,20,19,20], 
     'task_id': [11,22,11,22,11,22], 
     "task": ["task_1","task_1","task_1","task_1","task_1","task_1"], 
     "username": ["tom","jery","tom","jery","tom","jery"],
     "image_id":[101,202,303,404,505,606],
     "frame":[0,0,9,8,11,11],
     "label":['foo','foo','bar','xyz','bar','bar']} 
df = pd.DataFrame(data=d)

所以我的df是长格式的,有一些重复的,只有image_id是唯一的。我试着旋转我的df,用pd.pivotpd.merge,用username重新整形为宽格式。
我的代码:

pd.pivot(df, index=['task','frame','image_id'], columns = 'username', values='label')

我的输出:

我期望(或想要达到):

所以,正如你所看到的,我的输出中并不需要image_id,只需要summary,即每帧中用户使用的标记。

ljsrvy3e

ljsrvy3e1#

您可以在pivot之后添加groupby.first

(pd.pivot(df, index=['task','frame','image_id'],
          columns='username', values='label')
   .groupby(level=['task','frame']).first()
)

或者将pivot_tableaggfunc='first'一起使用:

pd.pivot_table(df, index=['task','frame'],
               columns='username', values='label',
               aggfunc='first')

输出:

username      jery   tom
task   frame            
task_1 0       foo   foo
       8       xyz  None
       9      None   bar
       11      bar   bar

相关问题