python - 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']
?
解决方案
使用类创建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
which 已经为我们做了这件事。
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>'
这和我做的一样:)。
推荐阅读
- python - Python Tensorflow session.run() 发布 GIL
- listview - Flutter:如何在包含其他类型小部件的 ListView.builder 末尾添加一个按钮小部件?
- javascript - 未选择语言时如何收到错误消息?
- variables - 如何在 emacs elisp .dir-locals.el 中连接字符串?
- java - 为什么 Collections.unmodifiableMap 不检查传递的地图是否已经是 UnmodifiableMap?
- java - 我无法理解联系方式 [] Myfriends line
- objective-c - 如何使用 Objective-C 在 Cocoa 中处理打印事件(通过快捷键 CMD + P)?
- google-chrome - 有没有什么方法可以在不使用 QZ 托盘之类的应用程序的情况下从 Google Chrome 打印到本地网络中的热敏打印机(escpos)?
- c# - 关于使用对象初始化器进行向上转换、继承和设置属性的概念
- java - HttpUrlConnection 时出现 GMS 或 ThreadPoolExecutor 错误