Python与Pandas中是否存在可返回全部行的虚拟对比变量?
解决方案
方法1:通用自定义匹配对象(推荐,适配所有对比列)
你可以通过定义一个重写了相等判断逻辑的类,创建通用的虚拟匹配值,该值和任意对象做==比较都会返回True,完全适配你50个对比列的场景,不需要针对每个列做特殊处理:
# 定义通用虚拟匹配类 import numpy as np class DummyMatcher: def __eq__(self, other): # 逐元素返回True,适配pandas Series批量比较 return np.ones(len(other), dtype=bool) # 可选,添加该方法避免pandas版本差异带来的广播警告 def __array_ufunc__(self, ufunc, method, *inputs, **kwargs): if ufunc == np.equal and method == '__call__': return np.ones(len(inputs[1]), dtype=bool) return NotImplemented # 实例化虚拟值 dummy = DummyMatcher()
使用方式直接把dummy变量加入你的遍历列表即可,不需要做其他修改:
dfNew = [] # 直接把dummy加入遍历列表,元素类型可以混合字符串和自定义对象 for ii in ['a1', 'a2', dummy]: for jj in ['a', 'b', dummy]: dfNew.append(df[(df['C1'] == ii) & (df['C2'] == jj)])
当遍历到dummy值时,对应的==判断会对所有行返回True,相当于该过滤条件被忽略,仅保留其余条件生效,完全符合你的需求。
方法2:列自身作为匹配值(无缺失值场景可用)
如果你确定对应对比列不存在NaN缺失值,也可以直接把列本身作为虚拟值加入列表,df['C1'] == df['C1']会对所有非NaN行返回True:
# C1列的虚拟值为自身Series c1_dummy = df['C1'] for ii in ['a1', 'a2', c1_dummy]: ...
注意事项
- 方法1的
DummyMatcher实例可以在所有对比列的遍历列表中通用,不需要为每个列单独创建 - 如果你的数据中存在
NaN值,仅推荐使用方法1,因为NaN == NaN在pandas中默认返回False,方法2会过滤掉NaN行
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

