You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于国家列表筛选DataFrame有效位置?排查代码异常

问题分析与解决方案

核心问题点

  1. 函数参数未利用:定义了input_country_list参数,但函数内部完全未使用,反而重复读取文件,冗余且易出错。
  2. 文件名不一致:外部读取cntry_list.csv,函数内误写为cntrylst.csv,可能导致国家列表读取错误。
  3. 比较逻辑错误:拆分后的位置是列表类型(如["Paris", "France"]),直接与country_names.values中的字符串比较,永远无法匹配——你看到的France是巧合性错误输出。
  4. 重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:05:33