You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:07:48