繁体   English   中英

python和pandas中是否有虚拟比较变量

[英]Is there a dummy comparison variable in python and 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实现的是还dfNew ,如果['a1', 'a2', 'dummy']存在虚拟变量,则仅完成其他比较操作。 列数接近 50,因此不可能在条件操作中对每一对进行编码以忽略。

Edit2:你如何在['a1', 'a2', 'dummy']传递假人?

用一个类创建一个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.any已经为我们做了这件事。

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>'

这和我所做的一样:)。

为什么不是这个?

df[df['C1'] == df['C1']]

这将适用于 NaN以外的所有值,因为 NaN != NaN。

事实上,由于 NaN 的特性(也许更准确地说,定义),您可以这样做(尽管 OP 明确要求仅使用== ):

df[df['C1'] == np.nan]

(我对此进行了测试,并且正如预期的那样,返回了所有行,包括 NaN 行。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM