我正在寻找最快的惯用类比到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.concat
与drop_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中的许多相关帖子,以陈述以下几点: 熊猫-使用`。滚动()`在多个列上 但是指定的解决方案都没有解决这个问题。 有没有直