python Pandasgroupby和制作套装道具

vjrehmav  于 2022-10-30  发布在  Python
关注(0)|答案(4)|浏览(126)

我正在使用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})

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

svmlkihl

svmlkihl1#

更新

  • 直到Pandas0.22版本,这都是一个问题。
  • 在panda 1.1.2版本中,这不是一个问题。聚合set,不会产生TypeError: 'type' object is not iterable
  • 不确定何时更新了功能。

原始答案

这是因为settypetype,而to_settypefunction

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代码化函数名
  • function
  • list个函数
  • dict列-〉函数
  • 嵌套的dict名称-〉函数的字典
bkhjykvo

bkhjykvo2#

请尝试使用:

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

对我有用。

4dbbbstv

4dbbbstv3#

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

ar5n3qh5

ar5n3qh54#

如果使用.agg({'set': set})产生以下错误,请更新Pandas 1.3.3版:
TypeError: Unable to infer the type of the field set
如果只是使用前面建议的.agg({'set': lambda x: set(x)})解决方案,则会持续出现这种情况
其原因是set_aggregatedetailed explanation here, courtesy of @EdChum)中不满足is_list_like
因此,解决方案是使用以下命令将其强制转换为列表:
.agg({'set': lambda x: list(set(x))})

相关问题