Pandas 将具有多个值的行数据合并到列的 Python 列表中

Posted

技术标签:

【中文标题】Pandas 将具有多个值的行数据合并到列的 Python 列表中【英文标题】:Pandas Merge row data with multiple values to Python list for a column 【发布时间】:2018-02-26 18:46:49 【问题描述】:

我有一个看起来像

的数据框

数据

*id*,             *name*,                      *URL*,                 *Type*  
    2,             birth_france_by_region,    http://abc. com,       T1 
    2,             birth_france_by_region,    http://pt. python,     T2 
    3,             long_lat,                  http://abc. com,       T3 
    3,             long_lat,                  http://pqur. com,      T1 
    4,             random_time_series,        http://sadsdc. com,    T2 
    4,             random_time_series,        http://sadcadf. com,   T3
    5,             birth_names,               http://google. com,    T1 
    5,             birth_names,               http://helloworld. com,T2 
    5,             birth_names,               http://hu. com,        T3

我想要一个这个数据框来合并 id 相等的行,并有一个 Type 列表对应的 URL 列表 所以最终输出应该是这样的

*id*, *name*,             *URL*,                               *Type*  
2,birth_france_by_region,  [http://abc .com,http://pt.python], [T1,T2] 
3,long_lat,           [http://abc .com,http://pqur. com],       [T3,T1] 
4,random_time_series, [http://sadsdc. com,http://sadcadf .com,],[T2,T3] 
5,birth_names,        [http://google .com,http://helloworld. com,
                                       http://hu. com] ,   [T1,T2,T3]

【问题讨论】:

This 问题解决了数据框只有两列的情况。答案中有一个警告,类似于此处接受的解决方案(最简单的形式:df.groupby['id'].agg(list))存在巨大的性能问题。 【参考方案1】:

我认为你需要groupby 和聚合tuple 然后转换为list

df = df.groupby(['id','name']).agg(tuple).applymap(list).reset_index()

print (df)
   id                    name  \
0   2  birth_france_by_region   
1   3                long_lat   
2   4      random_time_series   
3   5             birth_names   

                                                 URL          Type  
0                 [http://abc.cm, http://pt.python]      [T1, T2]  
1                  [http://abc.cm, http://pqur.com]      [T3, T1]  
2            [http://sadsdc.com, http://sadcadf.com]      [T2, T3]  
3  [http://google.;com, http://helloworld.com, ht...  [T1, T2, T3] 

因为在 0.20.3 版本中引发错误:

df = df.groupby(['id','name']).agg(lambda x: x.tolist())

ValueError: 函数不归约

【讨论】:

先生,只有当我传递 id 和 name 时,我将 'name' 作为 groupby 参数传递时,它才有效,我得到 Function 不会减少错误。 现在完美了。 是的,它看起来像错误。 @Bharathshetty & jezrael:该错误与此密切相关:***.com/questions/45928415/… @RahulAgarwal - 如果聚合,则需要为每一列提供聚合函数,否则会丢失。【参考方案2】:

这将为您提供“URL”列的预期结果:

test.groupby(["id", "name"])['URL'].apply(list)

id  name                  
2   birth_france_by_region                 [http://abc. com, http://pt. python]
3   long_lat                                [http://abc. com, http://pqur. com]
4   random_time_series                [http://sadsdc. com, http://sadcadf. com]
5   birth_names               [http://google. com, http://helloworld. com, h...

但是,我找不到 URL 和类型列的解决方案。

我可以建议分两步完成:

temp_table1 = test.groupby(["id", "name"])['URL'].apply(list) temp_table2 = test.groupby(["id", "name"])['Type'].apply(list) 合并temp_table1 & temp_table2

【讨论】:

既然已经完成了一个步骤,为什么还要提出两个步骤。而且我认为您的意思是在轴 1 上连接而不是合并。

以上是关于Pandas 将具有多个值的行数据合并到列的 Python 列表中的主要内容,如果未能解决你的问题,请参考以下文章

合并具有来自两个不同列的匹配值的 DataFrame - Pandas [重复]

excel中,如何合把行的数据合并到列

将具有相同值的多行合并为pandas中的一行

如何组合 pandas df 以便可以合并具有置换 col1 和 col2 值的行,其中仅包含一个组合并汇总计数列

在 pandas 数据框中显示具有一个或多个 NaN 值的行

将列中具有相同值的行合并在一起