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()