当前位置: 首页 > 面试题库 >

熊猫类似于SQL MINUS / EXCEPT运算符,使用多列

夏侯渊
2023-03-14
问题内容

我正在寻找最快的惯用类比到SQL MINUS(AKA
EXCEPT)运算符

这就是我的意思-给出两个如下的Pandas DataFrames:

In [77]: d1
Out[77]:
   a  b  c
0  0  0  1
1  0  1  2
2  1  0  3
3  1  1  4
4  0  0  5
5  1  1  6
6  2  2  7

In [78]: d2
Out[78]:
   a  b   c
0  1  1  10
1  0  0  11
2  1  1  12

如何查找d1 MINUS d2仅考虑列"a""b"获得以下结果的结果:

In [62]: res
Out[62]:
   a  b  c
1  0  1  2
2  1  0  3
6  2  2  7

MVCE:

d1 = pd.DataFrame({
    'a': [0, 0, 1, 1, 0, 1, 2], 
    'b': [0, 1, 0, 1, 0, 1, 2], 
    'c': [1, 2, 3, 4, 5, 6, 7]
})

d2 = pd.DataFrame({
    'a': [1, 0, 1], 
    'b': [1, 0, 1], 
    'c': [10, 11, 12]
})

我尝试了什么:

In [65]: tmp1 = d1.reset_index().set_index(["a", "b"])

In [66]: idx = tmp1.index.difference(d2.set_index(["a","b"]).index)

In [67]: res = d1.loc[tmp1.loc[idx, "index"]]

In [68]: res
Out[68]:
   a  b  c
1  0  1  2
2  1  0  3
6  2  2  7

它给了我正确的结果,但是我感觉必须有一种更加惯用的,更好/更简洁的方法来实现这一目标。

PS DataFrame.isin()方法在这种情况下无济于事,因为它会产生错误的结果集


问题答案:

我们可以使用pandas.concatdrop_duplicates这里传递参数放弃
所有重复 使用keep=False

pd.concat([d1, d2]).drop_duplicates(['a', 'b'], keep=False)

   a  b  c
1  0  1  2
2  1  0  3
6  2  2  7

OP发表评论后编辑

如果您要确保df2考虑到arnt中的唯一行,我们可以重复以下操作df

pd.concat([d1, pd.concat([d2]*2)]).drop_duplicates(['a', 'b'], keep=False)

   a  b  c
1  0  1  2
2  1  0  3
6  2  2  7


 类似资料:
  • 问题内容: 我正在使用以下df: 我想在所有年份中强制使用数字: 有没有简单的方法可以做到这一点,还是我必须全部输入? 问题答案: 更新: 您以后不需要转换值,可以在读取CSV时 即时 进行: 如果您需要将多列转换为数字dtypes,请使用以下技术: 样本来源DF: 将选定的列转换为数字dtypes: PS,如果要选择 所有 ()列,请使用以下简单技巧:

  • 问题内容: 我有一个简单的SQL语句。 从表名中选择与“%TEST%”不同的值 如何在Linq to SQL语法中编写此代码。 我尝试了下面的语句,但它似乎不起作用。 问题答案: 问题是“%”-您正在寻找的东西实际上不包含“%TEST%”,这很可能就是所有东西。我想你的意思是:

  • 我想在pandas上运行一个pivot,索引是两列,而不是一列。例如,一个字段表示年份,一个字段表示月份,一个显示“项目1”和“项目2”的“项目”字段以及一个带有数值的“值”字段。我希望索引是年-月。 我唯一能做到这一点的方法是将这两个字段合并成一个字段,然后再将它们分开。有更好的办法吗? 下面复制了最少的代码。谢谢! PS是的,我知道还有其他关于“pivot”和“multi-index”关键字的

  • 我想从我的CSV文件中选择数据。 虽然我可以在哪一列中获取数据 如下所示,我不知道如何从何处获取数据

  • 问题内容: 我有一个包含多个列的数据集,我希望对其进行一次热编码。但是,我不想为每个编码都有编码,因为所说的列与所说的项目有关。我想要的是一组使用所有列的虚拟变量。请参阅我的代码以获得更好的解释。 假设我的数据框如下所示: 如果我执行 输出将是 但是,我想获得的是这样的东西: 代替具有表示编码,例如多列的和,我只希望有一组(,,等等)与值时任何在列中的值的,,显示出来。 需要说明的是,在我的原始数

  • 我正在编写一个代码,将滚动窗口应用于返回多列的函数。 输入:熊猫系列 预期输出:3列数据帧 res的内容: 错误: 我尝试过的: 在应用中更改原始=真 在应用中使用lambda函数 以列表/numpy数组/dataframe/series的形式返回fun1中的结果 我还浏览了SO中的许多相关帖子,以陈述以下几点: 熊猫-使用`。滚动()`在多个列上 但是指定的解决方案都没有解决这个问题。 有没有直