Groupby 和 Aggregate 以列表为元素的 pandas 列,并在列表中获取唯一值

Posted

技术标签:

【中文标题】Groupby 和 Aggregate 以列表为元素的 pandas 列,并在列表中获取唯一值【英文标题】:Groupby and Aggregate over a pandas column with list as elements, and get unique values in list 【发布时间】:2021-02-26 19:26:14 【问题描述】:

我有以下数据框

df = pd.DataFrame(
    
        "id": [1, 2, 1, 3],
        "values": [[111, 121, 131], [211, 221, 281], [111, 191], [301, 321]],
    
)
# df
id  values
1   [111, 121, 131]
2   [211, 221, 281]
1   [111, 191]
3   [301, 321]

我想在 groupby 和聚合步骤之后得到以下内容

id  values
1   [111, 121, 131, 191]
2   [211, 221, 281]
3   [301, 321]

我正在使用以下内容,但它给了我一个错误 -

new_df = df.groupby(["id"]).agg("values": lambda val: set(val)).reset_index()

TypeError: unhashable type: 'list'

【问题讨论】:

【参考方案1】:

一种方法-

df.groupby('id')['values'].sum().apply(lambda x: list(set(x))).reset_index()

输出

    id  values
0   1   [191, 131, 121, 111]
1   2   [221, 211, 281]
2   3   [301, 321]

【讨论】:

【参考方案2】:

这应该可以工作

复制你的例子:

import pandas as pd

df = pd.DataFrame('id': [1, 2, 1, 3], 'values': [[111, 121, 131], [211, 221, 281], [111, 191], [301, 321]])

解决问题

df = df.groupby(by='id').sum()
df[['values']] = df[['values']].applymap(lambda x: set(x))

输出

    values
id  
1   121, 131, 191, 111
2   281, 211, 221
3   321, 301

【讨论】:

【参考方案3】:

您可以使用df.explode,然后在此处使用GroupBy.unique

df.explode('values').groupby('id')['values'].unique().reset_index()
    id  values
0   1   [191, 131, 121, 111]
1   2   [221, 211, 281]
2   3   [301, 321]

【讨论】:

以上是关于Groupby 和 Aggregate 以列表为元素的 pandas 列,并在列表中获取唯一值的主要内容,如果未能解决你的问题,请参考以下文章

使用 groupby 或 aggregate 合并 RDD 或 DataFrame 中每个事务中的项目以进行 FP-growth

Spark DataFrame 的通用“reduceBy”或“groupBy + aggregate”功能

提高性能(矢量化?) pandas.groupby.aggregate

groupby和aggregate函数不在一起组合(同一组下的多个聚合数)

Pandas GroupBy.agg() 抛出 TypeError: aggregate() 缺少 1 个必需的位置参数:'arg'

Django基础aggregate和annotate方法使用详解与示例