Python 使用pandas将列表元素添加到一起
我有以下一组词典:Python 使用pandas将列表元素添加到一起,python,pandas,Python,Pandas,我有以下一组词典: items = [ { 'FirstName': 'David', 'Language': ['en',] }, { 'FirstName': 'David', 'Language': ['fr',] }, { 'FirstName': 'David', 'Language': ['en',] }, { 'FirstName': 'Bob', 'Language': ['en',] } ] 我想根据Firs
items = [
{
'FirstName': 'David',
'Language': ['en',]
},
{
'FirstName': 'David',
'Language': ['fr',]
},
{
'FirstName': 'David',
'Language': ['en',]
},
{
'FirstName': 'Bob',
'Language': ['en',]
}
]
我想根据FirstName对其进行分组,并将独特的语言添加到一起,如下所示:
items = [
{
'FirstName': 'David',
'Language': ['en', 'fr']
},
{
'FirstName': 'Bob',
'Language': ['en',]
}
]
我将使用的SQL是:
SELECT FirstName, GROUP_CONCAT(DISTINCT Language ORDER BY Language)
FROM items
GROUP BY FirstName
使用pandas,我将如何结合这些,并根据FirstName进行分组,从而获得一系列独特的语言?以下是我到目前为止的情况:
>>> df = pandas.DataFrame(items)
>>> df.groupby('FirstName')['Language']
.apply(lambda x: list(set(x))) # this line is off
.reset_index()
.to_dict(orient='records')
我假设您一直得到不可损坏的类型:“list”
,因此我只需使用列表理解来从中获取值,然后将其展平,因为在仅进行列表理解后,它最终看起来是这样的:
FirstName
Bob [[en]]
David [[en], [fr], [en]]
您可以使用:
df.groupby('FirstName').sum().applymap(lambda s: list(set(s)))
将对每个元素应用一个函数,将列表映射到消除重复的列表
In [185]: df = pd.DataFrame(items)
In [186]: df
Out[186]:
FirstName Language
0 David [en]
1 David [fr]
2 David [en]
3 Bob [en]
In [187]: df.groupby('FirstName').sum().applymap(lambda s: list(set(s)))
Out[187]:
Language
FirstName
Bob [en]
David [en, fr]
使用总和聚合所有值,
transform
值进行设置,然后转换为\u dict()
使用:
输出:
[{'FirstName': 'Bob', 'Language': ['en']},
{'FirstName': 'David', 'Language': ['fr', 'en']}]
在每个组中创建列表第一个元素的集合
时间安排
每个回路7.31 ms±534µs(7次运行的平均值±标准偏差,每个100个回路)
每个回路2.09 ms±207µs(7次运行的平均值±标准偏差,每个100个回路)
语言键在第一个
items
列表中总是有一个项目吗?@user2285236不,语言可以有多个值。@RafaelC,你能解释一下它为什么不能回答这个问题吗?结果就是OP想要的。不用担心。最初没有添加结果,因此可能是误解。@david542 applyman和apply之间的时间差不是快3倍。还需要在某个地方指定“语言”(在上面的示例中很小,但有时会有其他字段)。
>>> df.groupby('FirstName').sum()["Language"].transform(set).reset_index().to_dict(orient='records')
[{'FirstName': 'Bob', 'Language': {'en'}},
{'FirstName': 'David', 'Language': {'en', 'fr'}}]
df.groupby('FirstName')['Language']\
.apply(lambda x: list(set(x.str[0])))\
.reset_index().to_dict('r')
[{'FirstName': 'Bob', 'Language': ['en']},
{'FirstName': 'David', 'Language': ['fr', 'en']}]
%timeit df.groupby('FirstName').sum().applymap(lambda s: list(set(s)))
%timeit df.groupby('FirstName')['Language'].apply(lambda x: list(set(x.str[0]))).to_frame()