假设我有一个数据帧,如下所示:
Group | Source | Name
___________________________
A | X | Jolly
A | X | Stone
A | X | Jolly
A | Y | Sand
B | X | Sand
B | X | Stone
B | Y | Stone
C | X | Sand
C | X | Stone
我想找出所有的Group
个,其中每组Source
个没有共同的Name
个.基本上在上面的例子中,我想要Group
A
,因为Source
(X
和Y
)Name
的所有分组都不共享公共值.在这个例子中,我们可以假设只有2个Source
(X
和Y
),并且不是所有Group
个都有超过1个Source
.我只对Group
s感兴趣,Source
s X
和Y
,没有Name
个十字路口.
生成的数据帧应如下所示:
Group | Source | Name
___________________________
A | X | Jolly
A | X | Stone
A | X | Jolly
A | Y | Sand
我已经试过了,在Group
上做了一个grouby
,然后为链式filter
方法提供了一个函数,如下所示:
def find_no_intersection(df):
return (
len(df[df.Source == 'X'].Name.values) > 0 and
len(df[df.Source == 'Y'].Name.values) > 0 and
(
len(
set(df[df.Source == 'X'].Name.values) &
set(df[df.Source == 'Y'].Name.values)
) == 0
)
)
df.groupby(['Group']).filter(find_no_intersection)
这条路对吗?有更好的方法吗?