如何基于国家列表筛选DataFrame有效位置?排查代码异常
问题分析与解决方案
核心问题点
- 函数参数未利用:定义了
input_country_list参数,但函数内部完全未使用,反而重复读取文件,冗余且易出错。 - 文件名不一致:外部读取
cntry_list.csv,函数内误写为cntrylst.csv,可能导致国家列表读取错误。 - 比较逻辑错误:拆分后的位置是列表类型(如
["Paris", "France"]),直接与country_names.values中的字符串比较,永远无法匹配——你看到的France是巧合性错误输出。 - 重复IO操作:函数内外多次读取相同文件,浪费资源且易引发数据不一致。
修正后的代码
import pandas as pd # 仅读取一次文件,避免重复IO cn_csv = pd.read_csv("~/Downloads/cntry_list.csv") # 转成集合加快查找速度,同时去除字符串前后空格 country_names = set(cn_csv['country'].str.strip()) results = pd.read_csv("~/Downloads/results.csv") # 处理源位置列:去除空值和前后空格 src_locs = results["Source Location"].dropna().str.strip() def country_name_check(locations, valid_countries): valid_locs = [] invalid_locs = [] for loc in locations: # 拆分位置并检查每个部分是否属于有效国家 parts = [p.strip() for p in loc.split(',')] has_valid_country = any(part in valid_countries for part in parts) # 同时处理整个位置就是国家名的情况(如单独的"France") if has_valid_country or loc in valid_countries: valid_locs.append(loc) else: invalid_locs.append(loc) return valid_locs, invalid_locs # 调用函数分离有效/无效位置 valid_locations, invalid_locations = country_name_check(src_locs, country_names) # 输出结果 print("有效位置:") for loc in valid_locations: print(loc) print("\n无效位置:") for loc in invalid_locations: print(loc)
更高效的Pandas向量化实现
如果数据量较大,推荐使用Pandas的向量化操作,避免手动循环:
import pandas as pd cn_csv = pd.read_csv("~/Downloads/cntry_list.csv") country_names = set(cn_csv['country'].str.strip()) results = pd.read_csv("~/Downloads/results.csv") # 定义判断有效位置的函数 def is_valid_location(loc): if pd.isna(loc): return False loc_stripped = loc.strip() parts = [p.strip() for p in loc_stripped.split(',')] return any(p in country_names for p in parts) or loc_stripped in country_names # 为DataFrame添加标记列 results['is_valid'] = results["Source Location"].apply(is_valid_location) # 分离有效和无效数据 valid_df = results[results['is_valid']] invalid_df = results[~results['is_valid']] # 输出结果 print("有效位置数据:") print(valid_df[["Source Location"]]) print("\n无效位置数据:") print(invalid_df[["Source Location"]])
内容的提问来源于stack exchange,提问作者intellgirl
相关产品推荐
相关产品推荐

