如何基于命令行输入通用过滤DataFrame并移除指定行
通用DataFrame过滤方案:处理自定义命令行输入格式
嘿,我来帮你搞定这个能适配所有指定输入格式的通用过滤方法!我们可以分三步来实现:先解析用户的输入字符串,再构建对应的过滤规则,最后把规则应用到DataFrame上筛选出需要保留的行。
首先,先把你的示例DataFrame定义出来,方便后续测试验证:
import pandas as pd data = { 'Id': [1,2,3,4,5,6,7,8,9,10,11,12], 'CTY': ['BNG','HYD','MUM','BNG','HYD','MUM','BNG','HYD','MUM','BNG','HYD','MUM'], 'Types': ['school','school','school','restaurant','restaurant','restaurant','hospital','hospital','hospital','school','restaurant','hospital'], 'isOpen': [True,True,True,False,True,False,True,True,True,False,True,True], 'seats': [100,150,200,1000,1500,500,700,300,1000,200,50,900] } df = pd.DataFrame(data)
核心思路拆解
用户的输入可以拆分为多个条件组(用|分隔),每个条件组是城市:类型列表的格式(不同类型用逗号分隔)。我们需要把这些条件转换成布尔掩码:只要某一行满足「CTY等于条件组中的城市,且Types属于该组的类型列表」,就标记为需要移除的行。最后保留未被标记的行即可。
完整实现代码
下面是通用的处理函数,能完美适配你提到的三种输入格式:
def filter_dataframe(df, input_str): # 初始化掩码:默认所有行都保留(False表示不需要移除) mask = pd.Series([False]*len(df), index=df.index) # 按|分割多个条件组,同时清理掉输入中可能存在的空格 condition_groups = [group.strip() for group in input_str.split('|')] for group in condition_groups: # 拆分城市和对应的类型列表 cty, types_str = group.split(':') # 把类型字符串转成集合,提升成员判断的效率 target_types = set(types_str.strip().split(',')) # 更新掩码:满足当前条件组的行标记为需要移除(True) mask |= (df['CTY'] == cty) & df['Types'].isin(target_types) # 返回过滤后的DataFrame:保留掩码为False的行 return df[~mask]
三种输入场景测试
场景1:输入BNG:school
result1 = filter_dataframe(df, "BNG:school") print(result1)
输出会移除Id=1和Id=10的行,也就是所有CTY=BNG且Types=school的记录。
场景2:输入HYD:school,restaurant
result2 = filter_dataframe(df, "HYD:school,restaurant") print(result2)
输出会移除Id=2(HYD:school)、Id=5(HYD:restaurant)、Id=11(HYD:restaurant)的行。
场景3:输入BNG:school | HYD:school,restaurant
result3 = filter_dataframe(df, "BNG:school | HYD:school,restaurant") print(result3)
输出会同时移除场景1和场景2中标记的所有行。
额外优化说明
- 自动兼容输入中的空格:比如
BNG:school | HYD:school,restaurant里的空格会被strip()清理,不影响规则判断。 - 类型列表顺序不影响结果:因为我们把类型转成了集合,集合的成员判断和顺序无关。
- 可扩展异常处理:如果担心用户输入格式错误(比如缺少
:),可以在函数里添加try-except块,提示用户输入格式不符合要求。
内容的提问来源于stack exchange,提问作者Girish HM
相关产品推荐
相关产品推荐

