我有以下数组:
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')
答案 0 :(得分:6)
汇总所有汇总,transform
值设置,然后to_dict()
>>> df.groupby('FirstName').sum()["Language"].transform(set).reset_index().to_dict(orient='records')
[{'FirstName': 'Bob', 'Language': {'en'}},
{'FirstName': 'David', 'Language': {'en', 'fr'}}]
答案 1 :(得分:3)
您可以使用:
df.groupby('FirstName').sum().applymap(lambda s: list(set(s)))
applymap会将函数应用于每个元素,将列表映射到重复数据删除列表。
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]
答案 2 :(得分:1)
from more_itertools import flatten
df.groupby('FirstName')['Language'].apply(lambda x: list(set(flatten([i for i in x]))))
.reset_index()
.to_dict(orient='records')
[{'FirstName': 'Bob', 'Language': ['en']},
{'FirstName': 'David', 'Language': ['en', 'fr']}]
我假设你不断获得unhashable type: 'list'
所以我只是使用列表理解来从中获取值然后展平它,因为它只是在列表理解之后看起来像这样:
FirstName
Bob [[en]]
David [[en], [fr], [en]]