【发布时间】:2018-09-07 06:56:39
【问题描述】:
回答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时,这将调用对象上的可迭代对象,在这种情况下将是列,因此你会得到这个奇怪的结果。当您使用lambda执行此操作时,这将调用系列值上的 set ctor -
给我 10 分钟,我应该有一个明确的答案,我正在逐步浏览源代码
-
到目前为止我的发现:
.agg(set)最终调用pd.core.groupby.NDFrameGroupBy._aggregate_generic,而.add(lambda x: set(x))最终调用pd.core.groupby._GroupBy._python_agg_general。这两个函数都可以用set或lambda x: set(x)调用(即._aggregate_generic(set)/._aggregate_generic(lambda x: set(x))和._python_agg_general(set)/._python_agg_general(lambda x: set(x))),每个函数在两种情况下产生相同的结果,但我还没有发现在哪里/为什么决定打电话给一个或另一个。 -
我花了 2 个小时浏览
pandas源代码。令人沮丧的不透明。很少有cmets。我将奖励一个通过源代码到达此答案底部的答案。
标签: python pandas pandas-groupby