【发布时间】:2018-12-07 08:07:57
【问题描述】:
我不明白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:
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 的好处是避免了这种显式映射。我哪里做错了?
【问题讨论】:
标签: python pandas dataframe pandas-groupby