Pandas如何修复使用另一DataFrame过滤DataFrame结果异常问题
Pandas 按规则表筛选代码修正方案
原代码核心问题
- 遍历规则表
df_para时未提取当前行的参数,始终对整列做非空判断:由于规则表两列本身就包含空字符串,两个筛选判断永远不会触发,每次循环都返回全量原始数据,最终出现全量行重复3次的错误结果。 - 筛选逻辑错位:应该判断当前遍历行的单个参数是否为空,为空则跳过该维度筛选,非空则按该参数值匹配,而非判断整列是否包含空值、用整列所有值做匹配集合。
- 使用了Pandas已废弃的
DataFrame.append()方法,合并效率低且新版环境会报错。
修正后可运行代码
import pandas as pd # 测试数据构造 data = {'a':['a','b','c','d','e','f','g'], 'b':['Y','N','Y','Y','Y','N','Y'], 'c':['Qualified','Unqualified','Qualified','Unqualified','Qualified','Unqualified','Qualified']} df = pd.DataFrame(data) df_para = {'Y/N':['','y','n'], 'Q/U':['unqualified','','unqualified']} df_para = pd.DataFrame(df_para) # 筛选逻辑 result_cache = [] for _, rule in df_para.iterrows(): temp_df = df.copy() # Q/U维度筛选 qu_filter = rule['Q/U'].strip().lower() if qu_filter: temp_df = temp_df[temp_df['c'].str.lower() == qu_filter] # Y/N维度筛选 yn_filter = rule['Y/N'].strip().lower() if yn_filter: temp_df = temp_df[temp_df['b'].str.lower() == yn_filter] result_cache.append(temp_df) df_output = pd.concat(result_cache)
运行后输出与预期完全一致:
a b c 1 b N Unqualified 3 d Y Unqualified 5 f N Unqualified 0 a Y Qualified 2 c Y Qualified 3 d Y Unqualified 4 e Y Qualified 6 g Y Qualified 1 b N Unqualified 5 f N Unqualified
关键调整说明
- 遍历规则表时正确解包行对象,逐行读取筛选规则,不再对整列做全局判断。
- 每次循环生成原始数据的拷贝作为临时筛选表,避免修改原数据。
- 对参数做空值判断时增加
strip()处理,兼容参数带空格的异常场景,统一转小写后做匹配,避免大小写不一致导致匹配失败。 - 用列表缓存每次筛选的结果,最后通过
pd.concat一次性合并,性能优于逐行append,且兼容所有新版Pandas环境。
内容的提问来源于stack exchange,提问作者yiyang chen
相关产品推荐
相关产品推荐

