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。