如何使用Pandas将指定长格式DataFrame转换为宽格式?
Pandas实现长表转宽表的方法
当然有啦!你要完成的是典型的长格式数据转宽格式数据的操作,Pandas里有两种非常常用的方法可以轻松实现你的需求:
方法1:使用pivot()(无重复组合时首选)
pivot()是最直接的方式,专门用于这种行列转换的场景,当你的music_id和users_id组合没有重复值时,用它最合适。
代码示例:
import pandas as pd # 构造你的原始DataFrame df = pd.DataFrame({ 'music_id': ['A', 'A', 'A', 'B', 'B', 'B'], 'users_id': ['a', 'c', 'b', 'e', 'a', 'b'], 'scores': [1, 2, 1, 2, 3, 1] }) # 执行透视转换 result_df = df.pivot( index='music_id', # 指定作为行索引的列 columns='users_id', # 指定作为新列名的列 values='scores' # 指定填充到新表格中的值 ) print(result_df)
运行后输出的结果完全符合你的要求:
users_id a b c e music_id A 1.0 1.0 2.0 NaN B 3.0 1.0 NaN 2.0
(注:这里的.0是因为Pandas自动把int类型转成了float,如果你需要保留整数类型,可以用result_df.fillna(0).astype(int),不过你的示例里是NaN,所以默认结果就可以)
方法2:使用pivot_table()(处理重复组合时必备)
如果你的数据里存在同一个music_id+users_id的组合对应多个scores值(比如同一个用户给同一首歌打了多次分),pivot()会报错,这时候就需要用pivot_table()来做聚合处理。
代码示例(无重复值时结果和pivot()一致):
result_df = df.pivot_table( index='music_id', columns='users_id', values='scores', aggfunc='mean' # 指定聚合函数,比如mean、sum、max等,默认是mean )
如果有重复值,比如新增一条('A', 'a', 3)的数据,你可以用aggfunc='sum'来求和,或者aggfunc='max'取最高分,非常灵活。
小提示
如果想要把music_id从索引变回普通列,可以用result_df.reset_index(),这样表格的结构会更符合一些场景的需求。
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

