Python 用于将列和值与行匹配的函数-数据帧的交集

Python 用于将列和值与行匹配的函数-数据帧的交集,python,pandas,match,typeerror,Python,Pandas,Match,Typeerror,假设我有以下数据帧: >>>df = pd.DataFrame([[5,2,3,11],[5,3,3,8],[9,4,11,12],[5,14,15,16]],columns=["a","b","c","d"]) >>>df a b c d 0 5 2 3 11 1 5 3 3 8 2 9 4 11 12 3 5 14 15 16 如果我想匹配列值为“a”等于5、“b”小于10、“c”大于或等于3

假设我有以下数据帧:

>>>df = pd.DataFrame([[5,2,3,11],[5,3,3,8],[9,4,11,12],[5,14,15,16]],columns=["a","b","c","d"])
>>>df
   a   b   c   d
0  5   2   3  11
1  5   3   3   8
2  9   4  11  12
3  5  14  15  16
如果我想匹配列值为“a”等于5、“b”小于10、“c”大于或等于3的所有行,我可以执行以下操作:

df[(df['a'] == 5) & (df['b'] < 10) & (df['c'] >= 3)]
输入代码来匹配行很费劲,因此我决定创建一个名为
row\u matcher
的函数,该函数包含两个参数:一个Pandas数据帧和一个长度为3的列表-选择列、运算符和值

def get_operator_fn(op):
    import operator
    return {
        '<' : operator.lt,
        '<=' : operator.le,
        '==' : operator.eq,
        '!=' : operator.ne,
        '>=' : operator.ge,
        '>' : operator.gt,
        '&' : operator.and_
        }[op]

def row_matcher(df,parameters):
    import pandas as pd
    """Parameter should be [column,operation,value]
    Example: ['trial',"==",1]
    """
    operations = [df[get_operator_fn(operation)(df[column],value)] for column,operation,value in parameters]
    return reduce(lambda left,right: pd.merge(left,right,how='inner'), operations)

>>>row_matcher(df,[["a","==",5],["b","<",10],["c",">=",3]])
def get_操作符(op):
进口经营者
返回{
'':operator.gt,
“&”:运算符和_
}[作品]
def行匹配器(df,参数):
作为pd进口熊猫
“”“参数应为[列、操作、值]
示例:[‘试用’,“=”,1]
"""
操作=[df[get_operator_fn(操作)(df[column],value)],用于列、操作、参数中的值]
返回reduce(lambda left,right:pd.merge(left,right,how='inner'),操作)
>>>行匹配器(df,[[“a”,“5”,“b”,“3]”)
不幸的是,对于这段代码,它为
返回reduce(…)
行抛出了一个错误:
TypeError:无法将类型与系列进行比较

我尝试将
返回减少(…)
行替换为:
df[reduce(操作员和操作)]

这仍然会导致错误:
TypeError:&:'str'和'str'的操作数类型不受支持。


我将感谢任何帮助

我认为使用这种方法会简单得多。使用此方法,您的初始示例可以写成:

df.query('a==5 & b<10 & c>=3')
df.query('a==5&b=3')
老实说,如果您使用query()方法,我认为您不会从函数中获得太多好处,除非您从外部文件中读取大量条件。如果仍要编写
行匹配器
函数,只需使用字符串联接将列表组合为单个字符串,并遵循query()语法即可。获得单个字符串后,将其传递给query()方法


您可能需要安装
numexpr
模块才能使用query()方法。您可以通过向query()方法提供关键字参数
engine='python'
来解决这个问题。这可能比使用
numexpr
模块效率低,因此如果性能出现问题,安装该模块可能是值得的。

我认为使用该方法会简单得多。使用此方法,您的初始示例可以写成:

df.query('a==5 & b<10 & c>=3')
df.query('a==5&b=3')
老实说,如果您使用query()方法,我认为您不会从函数中获得太多好处,除非您从外部文件中读取大量条件。如果仍要编写
行匹配器
函数,只需使用字符串联接将列表组合为单个字符串,并遵循query()语法即可。获得单个字符串后,将其传递给query()方法


您可能需要安装
numexpr
模块才能使用query()方法。您可以通过向query()方法提供关键字参数
engine='python'
来解决这个问题。这可能比使用
numexpr
模块效率低,因此如果性能出现问题,安装该模块可能是值得的。

我必须安装并导入numexpr模块才能使其正常工作。@floydn:Me。我不知道是不是只有我错过了它,或者是可能经常错过的东西。我将编辑我的答案,以解决可以提供的关键字参数,以避免使用numexpr。我必须安装并导入numexpr模块才能使其工作。@floydn:Me也是。我不知道是不是只有我错过了它,或者是可能经常错过的东西。我将编辑我的答案,以解决一个关键字参数,可以提供该参数以避免使用numexpr。