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 [重复]
如何组合 pandas df 以便可以合并具有置换 col1 和 col2 值的行,其中仅包含一个组合并汇总计数列