首页 > 解决方案 > python和pandas中是否有虚拟比较变量

问题描述

我有一个数据框df如下:

C1  C2  C3
a1  a   d
b1  b   e
c1  c   f

如果我这样做,df[df['C1'] == 'a1']我会得到

C1  C2  C3
a1  a   d

是否有某种方法可以比较事物,以便如果我这样做df[df['C1'] == 'what should I use here'],我会得到所有行。即我正在寻找一个虚拟比较变量,以便忽略比较语句并返回所有行。

C1  C2  C3
a1  a   d
b1  b   e
c1  c   f

编辑:由于代码是祖父的,我只需要使用==比较语句。我不能用!=。比较变量来自一个 for 循环,如果可用,我可以在 for 循环中插入一个虚拟变量。

这是我无法修改的原始代码:

dfNew = []
for ii in ['a1', 'a2']:
 for jj in ['a', 'b']:
  dfNew.append(df[(df['C1'] == ii) & (df['C2'] == jj)])

我想要实现的dfNew是在如果有一个虚拟变量的地方也附加值,['a1', 'a2', 'dummy']那么只完成其他比较操作。列数接近 50,因此不可能对每一对进行编码以在条件操作中忽略。

Edit2:你如何通过里面的假人['a1', 'a2', 'dummy']

标签: pythonpandas

解决方案


使用类创建Dummy变量。

如果你想要一个真正的Dummy变量,官方和最干净的方法是创建一个__eq__(平等检查)总是返回的类True

class Dummy:
    def __eq__(self, other):
        return True

现在:

>>> df[df['C1'] == Dummy()]
   C1 C2 C3
0  a1  a  d
1  b1  b  e
2  c1  c  f
>>> 

总是给True

该类Dummy返回True所有相等性检查。

对于编辑。

做就是了:

['a1', 'a2', Dummy()]

使用unittest.mock.anywhich 已经为我们做了这件事。

unittest模块(内置模块)已经为我们完成了这个类。我们也可以使用它:

from unittest.mock import ANY

现在:

>>> df[df['C1'] == ANY]
   C1 C2 C3
0  a1  a  d
1  b1  b  e
2  c1  c  f
>>> 

也会工作!

的源代码与unittest.mock.ANY我所做的完全相同:

获取源代码ANY

import inspect
print(inspect.getsource(ANY.__class__))

输出:

class _ANY(object):
    "A helper object that compares equal to everything."

    def __eq__(self, other):
        return True

    def __ne__(self, other):
        return False

    def __repr__(self):
        return '<ANY>'

这和我做的一样:)。


推荐阅读