如何将eq、ne、gt等运算符传入DataFrame筛选函数?
解决DataFrame筛选函数传入eq/ne/gt等运算符对象的问题
你之前的自定义filter函数无法工作,是因为错误地把传入的运算符函数(比如operator.eq)当成了Series的方法来调用。正确的做法是直接调用这些运算符函数,将Series和目标值作为参数传入。
正确实现代码
import pandas as pd from operator import eq, ne, gt, lt df = pd.DataFrame({ 'Greet Ing': ['Hi Friend', 123, 'Hi Friend', '456'], 'Num': [10, 20, 30, 40] }) def filter(dataframe, column, operator, value): # 直接调用运算符函数,传入Series和目标值,得到布尔索引 return dataframe[operator(dataframe[column], value)] # 测试相等筛选 print(filter(df, 'Greet Ing', eq, 'Hi Friend')) # 测试不等筛选 print(filter(df, 'Greet Ing', ne, 'Hi Friend')) # 测试大于筛选 print(filter(df, 'Num', gt, 25)) # 测试小于筛选 print(filter(df, 'Num', lt, 25))
原理说明
operator.eq(a, b)等价于a == b,operator.ne(a, b)等价于a != b,这类运算符函数本身就是二元函数,支持直接传入pandas的Series对象和标量。- pandas的Series重载了比较运算符,因此用运算符函数处理Series时,会自动执行向量化比较,返回布尔类型的Series,刚好可以用来筛选DataFrame的行。
- 这种方式比通过字符串判断的偷懒写法更简洁,也能充分利用pandas的向量化性能优势。
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

