gpt4 book ai didi

python - df.groupby(...).agg(set) 与 df.groupby(...).agg(lambda x : set(x)) 相比产生不同的结果

转载 作者:IT老高 更新时间:2023-10-28 21:13:37 26 4
gpt4 key购买 nike

接听this question原来 df.groupby(...).agg(set)df.groupby(...).agg(lambda x: set(x)) 正在产生不同的结果。

数据:

df = pd.DataFrame({
'user_id': [1, 2, 3, 4, 1, 2, 3],
'class_type': ['Krav Maga', 'Yoga', 'Ju-jitsu', 'Krav Maga',
'Ju-jitsu','Krav Maga', 'Karate'],
'instructor': ['Bob', 'Alice','Bob', 'Alice','Alice', 'Alice','Bob']})

演示:

In [36]: df.groupby('user_id').agg(lambda x: set(x))
Out[36]:
class_type instructor
user_id
1 {Krav Maga, Ju-jitsu} {Alice, Bob}
2 {Yoga, Krav Maga} {Alice}
3 {Ju-jitsu, Karate} {Bob}
4 {Krav Maga} {Alice}

In [37]: df.groupby('user_id').agg(set)
Out[37]:
class_type instructor
user_id
1 {user_id, class_type, instructor} {user_id, class_type, instructor}
2 {user_id, class_type, instructor} {user_id, class_type, instructor}
3 {user_id, class_type, instructor} {user_id, class_type, instructor}
4 {user_id, class_type, instructor} {user_id, class_type, instructor}

我希望这里有同样的行为 - 你知道我错过了什么吗?

最佳答案

好的,这里发生的是 set 没有被处理,因为它不是 _aggregate 中的 is_list_like:

elif is_list_like(arg) and arg not in compat.string_types:

source

这不是 is_list_like 所以它在调用链上返回 None 以在这一行结束:

results.append(colg.aggregate(a))

source

这会引发 TypeError 作为 TypeError: 'type' object is not iterable

然后引发:

if not len(results):
raise ValueError("no results")

source

所以因为没有结果,我们最终调用了 _aggregate_generic:

source

然后调用:

result[name] = self._try_cast(func(data, *args, **kwargs)

source

这最终会变成:

(Pdb) n
> c:\programdata\anaconda3\lib\site-packages\pandas\core\groupby.py(3779)_aggregate_generic()
-> return self._wrap_generic_output(result, obj)

(Pdb) result
{1: {'user_id', 'instructor', 'class_type'}, 2: {'user_id', 'instructor', 'class_type'}, 3: {'user_id', 'instructor', 'class_type'}, 4: {'user_id', 'instructor', 'class_type'}}

我正在运行一个略有不同的 pandas 版本,但等效的源代码行是 https://github.com/pandas-dev/pandas/blob/v0.22.0/pandas/core/groupby.py#L3779

所以本质上是因为 set 不算作函数或可迭代,它只是折叠到调用系列可迭代的 ctor,在这种情况下是列,您可以看到相同的效果这里:

In [8]:

df.groupby('user_id').agg(lambda x: print(set(x.columns)))
{'class_type', 'instructor', 'user_id'}
{'class_type', 'instructor', 'user_id'}
{'class_type', 'instructor', 'user_id'}
{'class_type', 'instructor', 'user_id'}
Out[8]:
class_type instructor
user_id
1 None None
2 None None
3 None None
4 None None

但是当您使用匿名函数 lambda 时,它会按预期工作。

关于python - df.groupby(...).agg(set) 与 df.groupby(...).agg(lambda x : set(x)) 相比产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49537057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com