我不理解哪些函数可用于 groupby
+ transform
操作。通常,我只能猜测、测试、回滚直到有用的东西出现,但我觉得应该有一种系统的方法来确定解决方案是否可行。
这里是一个最简示例。首先,让我们使用 groupby
+ apply
与 set
:
df = pd.DataFrame({'a': [1,2,3,1,2,3,3], 'b':[1,2,3,1,2,3,3], 'type':[1,0,1,0,1,0,1]})
g = df.groupby(['a', 'b'])['type'].apply(set)
print(g)
a b
1 1 {0, 1}
2 2 {0, 1}
3 3 {0, 1}
这个很好用,但我想要通过分组计算set
并将结果作为原始数据框中的新列。因此我尝试使用transform
:
这段代码可以正常工作,但我希望将计算出的 set
按组添加到原始数据框中作为新列。所以我尝试使用 transform
:
df['g'] = df.groupby(['a', 'b'])['type'].transform(set)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
---> 23 df['g'] = df.groupby(['a', 'b'])['type'].transform(set)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'set'
这是我在Pandas v0.19.0中看到的错误。在v0.23.0中,我看到的是TypeError: 'set' type is unordered
。当然,我可以映射一个特定定义的索引来实现我的结果:
g = df.groupby(['a', 'b'])['type'].apply(set)
df['g'] = df.set_index(['a', 'b']).index.map(g.get)
print(df)
a b type g
0 1 1 1 {0, 1}
1 2 2 0 {0, 1}
2 3 3 1 {0, 1}
3 1 1 0 {0, 1}
4 2 2 1 {0, 1}
5 3 3 0 {0, 1}
6 3 3 1 {0, 1}
但是我认为transform
的好处是避免这样明确的映射。我错在哪里了?
transform
方法可以单独使用(不需要groupby
),且有特定的要求。尽管如此,在我的经验中,它通常与groupby
一起使用,这就是为什么我错误地认为任何与groupby
和apply
一起使用的内容都可以与transform
一起使用。 - jpp