Pandas:合并数据帧并将多个连接值合并到一个数组

时间:2017-06-28 19:20:23

标签: python arrays json pandas dataframe

我是Python的新手,我正在使用Pandas将一堆MySQL表转换为JSON。我目前的解决方案工作得很好,但(1)它不是非常pythonic,(2)我觉得必须有一些预先出炉的熊猫功能做我需要的......?对以下问题的任何指导都会有所帮助。

假设我有两个数据框authors和一个联接表plays_authors,表示作者与游戏的1:多关系。

print authors
>   author_id  dates notes
> 0         1  1700s     a 
> 1         2  1800s     b 
> 2         3  1900s     c 


print plays_authors
>      author_id play_id
> 0         1      12
> 1         1      13
> 2         1      21
> 3         2      18
> 4         3       3
> 5         3       7

我想将plays_authors合并到authors,但不是每个作者有多个行(每个play_id 1个),我希望每个作者有一行,数组为{{ 1}}值,以便我可以轻松地将它们导出为json记录。

   
play_id

我目前的解决方案:

print authors
>   author_id  dates notes       play_id
> 0         1  1700s     a  [12, 13, 21]
> 1         2  1800s     b          [18]
> 2         3  1900s     c        [3, 7]

authors.to_json(orient="records")
> '[{
>    "author_id":"1",
>    "dates":"1700s",
>    "notes":"a",
>    "play_id":["12","13","21"]
>   },
>   {
>    "author_id":"2",
>    "dates":"1800s",
>    "notes":"b",
>    "play_id":["18"]
>   },
>   {
>    "author_id":"3",
>    "dates":"1900s",
>    "notes":"c",
>    "play_id":["3","7"]
>  }]'

那里有一个简单的groupby /更好的dict解决方案吗?这个解决方案目前还在我头上?

1 个答案:

答案 0 :(得分:0)

数据:

In [131]: a
Out[131]:
   author_id  dates notes
0          1  1700s     a
1          2  1800s     b
2          3  1900s     c

In [132]: pa
Out[132]:
   author_id  play_id
0          1       12
1          1       13
2          1       21
3          2       18
4          3        3
5          3        7

解决方案:

In [133]: a.merge(pa.groupby('author_id')['play_id'].apply(list).reset_index())
Out[133]:
   author_id  dates notes       play_id
0          1  1700s     a  [12, 13, 21]
1          2  1800s     b          [18]
2          3  1900s     c        [3, 7]