【问题标题】:Pandas groupby and make set of items熊猫 groupby 并制作一组物品
【发布时间】:2016-06-01 15:14:01
【问题描述】:

我正在使用 pandas groupby 并希望应用该功能从组中的项目中进行设置。

TypeError: 'type' object is not iterable 中的以下结果:

df = df.groupby('col1')['col2'].agg({'size': len, 'set': set})

但以下工作:

def to_set(x):
    return set(x)
    
df = df.groupby('col1')['col2'].agg({'size': len, 'set': to_set})

在我的理解中,这两种表达方式很相似,请问第一种不起作用的原因是什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    更新

    • 直到 pandas 0.22 版,这是一个问题。
    • 从 pandas 1.1.2 版开始,这不是问题。聚合set,不会产生TypeError: 'type' object is not iterable
      • 不确定功能何时更新。

    原答案

    这是因为set 属于type typeto_set 属于type function

    type(set)
    <class 'type'>
    
    def to_set(x):
        return set(x)
    
    type(to_set)
    
    <class 'function'>
    

    根据docs.agg() 期望:

    参数:functiondict

    用于聚合组的函数。

    • 如果是function,则必须在传递DataFrame 或传递给时工作 DataFrame.apply
    • 如果传递了dict,则键必须是DataFrame 列 名字。

    接受的组合是:

    • string cythonized 函数名
    • function
    • list 的函数
    • dict 的列 -> 函数
    • 嵌套 dict 的名称 -> 函数的字典

    【讨论】:

    • 为了完整起见,它会引发错误TypeError: 'type' object is not iterable,这可能是因为如果您不传递 function 它需要一个函数列表。
    【解决方案2】:

    尝试使用:

    df = df.groupby('col1')['col2'].agg({'size': len, 'set': lambda x: set(x)})
    

    为我工作。

    【讨论】:

    • 如果你像刚才那样扔单线,你必须包括上下文来解释你做了什么以及为什么这样做。效仿用户 Stefan 的例子,会给你更多的同情和支持,而不仅仅是单线。您必须让未来的读者能够理解它,以便他们从中学习。
    • 'set': lambda x: set(x) 可以替换为'set': set
    【解决方案3】:

    如果出现以下错误,请更新 Pandas 的新版本

    SpecificationError: nested renamer is not supported
    
    df = df.groupby('col1')['col2'].agg(size= len, set= lambda x: set(x))
    

    【讨论】:

    • set= lambda x: set(x)可以简化为set=set
    猜你喜欢
    • 2020-03-25
    • 2016-04-21
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多