python - GroupBy 和聚合与集合交集
问题描述
我有一个带有集合列的熊猫数据框:
import pandas as pd
df = pd.DataFrame({'group_var': [1,1,2,2], 'sets_var': [set([0, 1]), set([1, 2]), set([3, 4]), set([5, 6, 7])]})
df
group_var sets_var
0 1 {0, 1}
1 1 {1, 2}
2 2 {3, 4}
3 2 {5, 6, 7}
我希望和 得到所有相应集合的交集groupby
,如下所示:group_var
sets_var
group_var sets_var
0 1 {1}
1 2 {}
或这样的系列:
sets_var
1 {1}
2 {}
我将如何优雅地处理它?性能是重中之重。
解决方案
使用groupby
,agg
和减少使用set.intersection
。
df.groupby('group_var', as_index=False).agg(lambda x: set.intersection(*x))
group_var sets_var
0 1 {1}
1 2 {}
如果性能绝对重要,我们可以尝试摆脱lambda
:
from functools import partial, reduce
import operator
p = partial(reduce, operator.and_)
df.groupby('group_var', as_index=False).agg(p)
group_var sets_var
0 1 {1}
1 2 {}
但是,这仅执行成对交叉,因此您的里程可能会有所不同。
或者,作为一个系列,
pd.Series({
k: set.intersection(*g.tolist())
for k, g in df.groupby('group_var')['sets_var']})
1 {1}
2 {}
dtype: object
推荐阅读
- docker - 按照 Realms 中的一般概述启用 Docker Bearer Token Realm
- r - 将具有多个维度的数据框转换为栅格图层
- java - 从 BLE 读取多个特征并读取字符串
- forms - 无法使用 pyrevit 表单
- android - 如何修复 RTL 对称警告
- php - 使用 PHP 脚本删除 MySQL 中的重复行
- javascript - 如何在 Jest 测试中正确模拟/包含 jQuery?
- mysql - 与 sp 一起使用并作为参数传递时,group by 子句不起作用
- ios - 为什么 AVPlayer 观察到的比特率(和比特率播放)在 iOS 13 中的第二次播放时会严重下降?
- javascript - 开玩笑:对传递给对象的函数的测试失败,并显示“已接收:序列化为相同的字符串”