如何将字符串类型的条件变量传入Python Pandas的.loc/.iloc查询方法?
pandas .loc接收用户输入字符串条件的解决方案
失效原因
你之前的尝试失败是因为.loc的行筛选参数需要布尔值序列(掩码),而用户输入的是普通字符串,无法直接被pandas识别为筛选逻辑,具体错误点如下:
- 直接把字符串条件传入
self.df[]:df[]仅支持传入列名、列名列表或布尔掩码,无法直接识别字符串形式的筛选逻辑 - slice方法误用:
slice()是用来生成索引切片的,比如slice(1,5)对应索引1到4的范围,不能用于传入条件判断 - format拼接语法错误:
self.df["{}".format(col_one)]"{}".format(col_two)的写法不符合Python语法,两个字符串对象直接拼接没有逻辑连接符,无法被解析
方案1:直接解析完整条件字符串(适合可信用户场景)
如果是个人使用、仅接收可信用户输入,可以用pandas.eval()方法直接把符合pandas语法的条件字符串转换为布尔掩码,实现你要的直接传入完整条件的需求:
import pandas as pd # 接收用户输入的完整条件,示例输入:State == "New York" col_one = input('Please enter the condition you would like to set. E.g. State == "New York":') # 解析条件为布尔掩码,local_dict参数让eval可以识别你的df变量 mask = pd.eval(col_one, local_dict={'df': self.df}) self.one_condition_input = self.df.loc[mask, :]
注意:
pd.eval()会执行输入的字符串内容,如果面向不可信用户开放输入,存在代码注入安全风险,请勿在生产环境使用该方案。
方案2:拆分输入组装条件(适合生产/不可信用户场景)
如果要规避安全风险,可拆分用户输入为列名、比较符、目标值三个部分,手动拼接筛选逻辑,示例代码如下:
# 分三次接收用户输入 col_name = input('请输入要筛选的列名:示例输入 State') op = input('请输入比较符:可选 ==、>、<、>=、<=、!=') target_val = input('请输入要匹配的目标值:示例输入 New York') # 根据比较符生成布尔掩码 if op == '==': mask = self.df[col_name] == target_val elif op == '>': mask = self.df[col_name] > target_val elif op == '<': mask = self.df[col_name] < target_val elif op == '>=': mask = self.df[col_name] >= target_val elif op == '<=': mask = self.df[col_name] <= target_val elif op == '!=': mask = self.df[col_name] != target_val else: raise ValueError('不支持的比较符,请输入==、>、<、>=、<=、!=中的一个') self.one_condition_input = self.df.loc[mask, :]
内容的提问来源于stack exchange,提问作者i_love_whiteboards
相关产品推荐
相关产品推荐

