python - pandas 数据框中条件过滤的通用函数

标签 python pandas filter

过滤条件示例:-

enter image description here 数据

x  y  z 
1  2  1
1  3  2
1  2  5
1  3  1

现在我想从给定的数据中过滤上述指定的条件。 为此,我需要一个通用函数,即该函数应该适用于任何过滤器,而不仅仅是上述指定的过滤器。

我知道如何在 python 中针对多个条件手动过滤数据。

我认为泛型函数可能需要两个参数,一个是数据,另一个是过滤条件。

但我无法找到编写通用函数来过滤数据的逻辑。

请任何人都可以帮助我解决。

提前致谢。

最佳答案

您可以创建条件列表,然后 np.logical_and.reduce :

x1 = df.x==1
y2 = df.y==2 
z1 = df.z==1
y3 = df.y==3

m1 = np.logical_and.reduce([x1, y2, z1])
m2 = np.logical_and.reduce([x1, y3, z1])

或者concat所有掩码都放在一起,并通过DataFrame.all检查每行的所有True。 :

m1 = pd.concat([x1, y2, z1], axis=1).all(axis=1)
m2 = pd.concat([x1, y3, z1], axis=1).all(axis=1)

编辑:

如果可能的话,定义列名以及用于在字典中过滤的值:

d1 = {'x':1, 'y':2, 'z':1}
d2 = {'x':1, 'y':3, 'z':1}

m1 = np.logical_and.reduce([df[k] == v for k, v in d1.items()])
m2 = np.logical_and.reduce([df[k] == v for k, v in d2.items()])

通过从字典创建的一行 DataFrame 进行合并的另一种方法:

df1 = pd.DataFrame([d1]).merge(df)

编辑:

对于一般解决方案,可以将文件的每个值解析为元组并使用 operators :

df1 = pd.DataFrame({0: ['x==1', 'x==1'], 1: ['y==2', 'y<=3'], 2: ['z!=1', 'z>1']})
print (df1)
      0     1     2
0  x==1  y==2  z!=1
1  x==1  y<=3   z>1


import operator, re

ops = {'>': operator.gt,
        '<': operator.lt,
       '>=': operator.ge,
       '<=': operator.le,
       '==': operator.eq,
        '!=': operator.ne}

#if numeric, parse to float, else not touch ()e.g. if string
def try_num(x):
    try:
        return float(x)
    except ValueError:
        return x

L = df1.to_dict('r')
#https://stackoverflow.com/q/52620865/2901002
rgx = re.compile(r'([<>=!]+)')
parsed = [[rgx.split(v) for v in d.values()] for d in L]
L = [[(x, op, try_num(y)) for x,op,y in ps] for ps in parsed]
print (L)
[[('x', '==', 1.0), ('y', '==', 2.0), ('z', '!=', 1.0)], 
 [('x', '==', 1.0), ('y', '<=', 3.0), ('z', '>', 1.0)]]

现在按列表的第一个值 - 文件的第一行进行过滤:

m = np.logical_and.reduce([ops[j](df[i], k) for i, j, k in L[0]])
print (m)
[False False  True False]

关于python - pandas 数据框中条件过滤的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52606908/

相关文章:

python绘制一系列值的水平线

python - 相同的字符串在 python 中不匹配 - 空格问题(前导/尾随空格已删除)

AngularJS - 用数字/长度过滤复选框

python - Pandas 在循环中合并数据帧

python - 根据条件更改数据框的值

javascript - 在嵌套数组中查找值

vb.net - 如何为 TableAdapter 参数设置值

python - 如何使用 DataFrame.apply() 处理异常

python - 如何在 Matplotlib 中创建 "dot plot"? (不是散点图)

python - 如何使用spark session 导入python文件?