如何利用Python API从Pandas列姓名中检测性别并生成新列
批量处理Pandas姓名列的性别检测方案
1. 预处理姓名(处理带头衔的情况)
部分姓名可能包含头衔(如Dr. Sylvia),需要先提取核心名字部分才能准确调用API。这里用正则去掉常见头衔,再取最后一个单词作为检测用的姓名:
import pandas as pd import re def extract_name(full_name): # 移除常见头衔,提取核心姓名 cleaned = re.sub(r'^(Dr\.|Mr\.|Ms\.|Mrs\.|Miss\.)\s', '', full_name.strip()) return cleaned.split()[-1] # 构造示例DataFrame data = {'name': ['Walker', 'Daniel', 'Steph', 'Dr. Sylvia', 'Gwendy']} df = pd.DataFrame(data) # 生成清洗后的姓名列 df['cleaned_name'] = df['name'].apply(extract_name)
2. 封装API调用函数(带缓存与错误处理)
原测试代码的URL参数有空格(?name = {name})会导致请求失败,这里修复格式,同时加入缓存避免重复请求、错误处理应对API异常:
import requests from functools import lru_cache @lru_cache(maxsize=1000) # 缓存已请求过的姓名结果,减少API调用次数 def get_gender(name): try: response = requests.get(f"https://api.genderize.io/?name={name}", timeout=5) response.raise_for_status() # 触发HTTP错误(如404、500) gender_data = response.json() # 提取性别并转为大写,无结果则返回None return gender_data.get('gender').upper() if gender_data.get('gender') else None except requests.exceptions.RequestException as e: print(f"请求姓名 {name} 时出错: {str(e)}") return None
3. 批量生成性别列
将清洗后的姓名传入API函数,生成最终的性别列,同时处理空值:
# 生成性别列 df['gender'] = df['cleaned_name'].apply(get_gender) # 空值填充为"Unknown" df['gender'] = df['gender'].fillna('Unknown') # 查看结果 print(df[['name', 'gender']])
注意事项
- API限制:genderize.io免费版有请求次数上限(每月1000次),如果处理大量数据,建议考虑本地性别数据集或者付费版API。
- 姓名预处理逻辑可根据实际数据调整:比如如果姓名是全名(如
John Doe),可能需要取第一个单词作为检测用姓名。 - 缓存可以大幅提升重复姓名的处理效率,避免不必要的API调用。
内容的提问来源于stack exchange,提问作者d9d9
相关产品推荐
相关产品推荐

