将pandas dataframe行转换为基于唯一id的列

2024-05-18 20:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个与下面类似的数据框song obj'实际上是一个嵌套的字典,包含关于一首歌的各种信息

{data:{album:{album name:---, album id:---}},track{track name:---,track id:---}}

有些播放列表很长,因此最多有400列,每个列都用整数标记。在

^{pr2}$

看起来像这样:

>>>
    playlist  id rating 0           1           2
0   8179      3         song obj 1  song obj 2  song obj 3
1   8764      2         song obj 4  song obj 5  NaN
2   8776      4         song obj 6  song obj 7  song obj 8

我试着让上面的数据帧看起来像这样,所有的“歌曲对象”都是垂直的,但在它们对应的播放列表编号旁边,就像下面的数据帧:

df1=pd.DataFrame({
"playlist id": {0: 8179,1:8179,2:8179,3:8764,4:8764,
                5:8776,6:8776,7:8776},
"rating": {0:3, 1:3, 2:3, 3:2, 4:2, 5:4, 6:4, 7:4},
"song objects": {0:"song obj 1", 1:"song obj 2", 2:"song obj 3", 
                 3:"song obj 4", 4:"song obj 5",5:"song obj 6",
                 6:"song obj 7",7:"song obj 8"}
             })
>>>
    playlist id  rating song objects
  0 8179         3      song obj 1
  1 8179         3      song obj 2
  2 8179         3      song obj 3
  3 8764         2      song obj 4
  4 8764         2      song obj 5
  5 8776         4      song obj 6
  6 8776         4      song obj 7
  7 8776         4      song obj 8

我试过使用pd.wide_to_longpd.melt,但到目前为止我没有运气。我也尝试过在堆栈交换上搜索,但由于我对编程/python/pandas不太熟悉,所以我没有正确的术语来找到我需要的东西..请帮助!在

注意:原因是最终我想将“song对象”解压到新列中。我想这在

df2=pd.concat([df2.drop(['song objects'], axis=1), df2['song objects'].apply(pd.Series)], axis=1)

Tags: 数据对象nameidobjalbumobjectssong
1条回答
网友
1楼 · 发布于 2024-05-18 20:15:26

您需要稍微修改一下,因为示例代码不会生成您指定的输出,例如rating列。在

import pandas as pd

df = pd.DataFrame({"playlist id" : {0 : 8179, 1:8764, 2:8776},
                0 : {0:"song obj",1:"song obj",2:"song obj"},
                1: {0:"song obj",1:"song obj",2:"song obj"},
                2 : {0:"song obj",1:"song obj",2:"song obj"}   
               })

pd.melt(df, id_vars = ['playlist id'], value_vars = [0, 1, 2])

输出:

^{pr2}$

相关问题 更多 >

    热门问题