繁体   English   中英

根据唯一ID将pandas数据框行变成一列

[英]Turn pandas dataframe row in to a column based on unique IDs

我有一个与下面类似的数据框。 “ Song obj”实际上是一首包含有关歌曲的各种信息的嵌套字典。

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

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

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"}   
               })

看起来像这样:

>>>
    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但到目前为止我还没有运气。 我也尝试过在堆栈交换上进行搜索,但是因为我是Programming / python / pandas的新手,所以我没有正确的术语来找到我所需要的..请帮忙!

注意:原因是因为最终我想将“歌曲对象”“解包”到新的列中。 我认为这有可能

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

您将不得不对此稍作修改,因为示例代码不会产生您所指示的输出,例如“ 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])

输出:

    playlist id     variable    value
0   8179    0   song obj
1   8764    0   song obj
2   8776    0   song obj
3   8179    1   song obj
4   8764    1   song obj
5   8776    1   song obj
6   8179    2   song obj
7   8764    2   song obj
8   8776    2   song obj

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM