如何结合pycountry获取包含249个国家的Pandas DataFrame?
错误根因定位
- 触发
TypeError: 'Country' object is not iterable的直接原因:pycountry返回的Country对象未实现可迭代的键值遍历接口,直接执行dict(i)强制转换时,内部会调用迭代逻辑遍历对象内容,因此抛出不可迭代的报错。 - 原代码逻辑缺陷:
- 循环内直接给空DataFrame的列赋值单值,pandas会生成没有任何数据行的空表,反复赋值只会覆盖列属性,完全无法累积收集到所有国家的信息
- pycountry收录的国家条目并非全部包含
original_name字段,即使解决了迭代问题,遍历到缺失字段的条目时也会触发KeyError
可直接运行的修复代码
import pandas as pd import pycountry # 预先定义空列表,逐行收集国家结构化信息 country_records = [] for country in pycountry.countries: record = { "alpha_3": country.alpha_3, "name": country.name, # 用getattr安全读取可选字段,无对应属性时自动填充空值 "original_name": getattr(country, "original_name", None) } country_records.append(record) # 一次性将收集完成的记录转换为DataFrame countries = pd.DataFrame(country_records) # 预览前5行数据 print(countries.head()) # 校验数据集总条目数(与pycountry收录的249个国家数量一致) print(f"数据集总记录数:{len(countries)}")
修复逻辑说明
- 不在循环过程中反复读写DataFrame,先将所有国家信息存入普通Python列表,最后一次性生成结构化数据集,既避免了赋值覆盖问题,也能大幅提升循环运行效率
- 跳过对Country对象的强制dict转换,直接读取对象暴露的公开属性,从根源上绕开不可迭代的报错
- 对非必选字段使用
getattr做安全读取,不会因为字段缺失中断循环运行
内容的提问来源于stack exchange,提问作者user12550010
相关产品推荐
相关产品推荐

