使用pandas将列表元素添加到一起

时间:2018-05-09 19:53:41

标签: python pandas

我有以下数组:

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

3 个答案:

答案 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]]