GroupBy与集合相交集合

Gio*_*oni 3 python group-by set pandas pandas-groupby

我有一个带有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}
Run Code Online (Sandbox Code Playgroud)

我想groupby的group_var和得到的所有相应集合的交集sets_var,就像这样:

   group_var sets_var
0          1      {1}
1          2      {}
Run Code Online (Sandbox Code Playgroud)

或类似的系列:

   sets_var
1  {1}
2  {}
Run Code Online (Sandbox Code Playgroud)

我如何优雅地去做?性能是重中之重。

cs9*_*s95 5

使用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       {}
Run Code Online (Sandbox Code Playgroud)

如果性能绝对重要,我们可以尝试摆脱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       {}
Run Code Online (Sandbox Code Playgroud)

但是,这仅执行成对相交,因此您的行驶里程可能会有所不同。


或者,作为一个系列,

pd.Series({
    k: set.intersection(*g.tolist()) 
    for k, g in df.groupby('group_var')['sets_var']})

1    {1}
2     {}
dtype: object
Run Code Online (Sandbox Code Playgroud)