如何使用 group by 检查一个数据框中的某一列的值是否存在于另一个数据框的某一列中?

3
我想要做的事情是: 1- 将数据框按照两个列进行分组 2- 从每个组中检查一列的值是否不在组中的另一列中。
x = pd.DataFrame({'x': [1,1,1,1,1,1,2], 'y': [4,4,4,5,5,5,4], 'z':['a', 'b', 'c', 'a', 'b', 'c', 'a'], 's':['a', 'a', 'b', 'a', 'a', 'a', 'b']})
x:
    x   y   z   s
0   1   4   a   a
1   1   4   b   a
2   1   4   c   b
3   1   5   a   a
4   1   5   b   a
5   1   5   c   a
6   2   4   a   b

我想要检查的是,按列 xy 分组的数据框中,列 z 的值是否不在列 s 中。

例如,在以下分组(x=1,y=4)中:

    x   y   z   s
0   1   4   a   a
1   1   4   b   a
2   1   4   c   b

结果将是第三行:
    x   y   z   s
0   1   4   c   b

我尝试了类似这样的东西,但它卡住了:
x= x.groupby(['x', 'y'])[(~x.z.isin(x.s)).index]

有什么建议吗?

先感谢您!

1个回答

3

左连接:

m = x.merge(x, left_on=['x','y','z'], 
            right_on=['x','y','s'], 
            how='left', suffixes=['','_']
           )

你将会看到:

   x  y  z  s   z_   s_
0  1  4  a  a    a    a
1  1  4  a  a    b    a
2  1  4  b  a    c    b
3  1  4  c  b  NaN  NaN
4  1  5  a  a    a    a
5  1  5  a  a    b    a
6  1  5  a  a    c    a
7  1  5  b  a  NaN  NaN
8  1  5  c  a  NaN  NaN
9  2  4  a  b  NaN  NaN

那么您的数据就是s_NaN的位置,因此

m.loc[m['s_'].isna(), x.columns]

输出:

   x  y  z  s
3  1  4  c  b
7  1  5  b  a
8  1  5  c  a
9  2  4  a  b

选项2: 在groupby上使用apply和isin函数:
(x.groupby(['x','y'])
  .apply(lambda d: d[~d['z'].isin(d['s'])])
  .reset_index(level=['x','y'], drop=True)
)

输出:

   x  y  z  s
2  1  4  c  b
4  1  5  b  a
5  1  5  c  a
6  2  4  a  b

太棒了,@Quang!第一个选项就可以了。然后我用了过滤器: x= x[x.s_.isna()] 非常感谢! - yorch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接