我有一个带有set列的pandas DataFrame:
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 {}
我该如何优雅地对待它?性能是重中之重。
答案 0 :(得分:4)
使用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