DataFrame中apply与get结合处理别名拆分失效,求解决方案
问题修正方案
1. 修复get_akas函数的逻辑缺陷
原函数找到第一个匹配的分隔符就直接return,导致只能提取一种别名,无法同时处理两种格式。修改后遍历所有分隔符,提取所有符合条件的别名:
def get_akas(s): delims = {"alias": "aka", "@": "lqaka"} akas = {} for key, col_name in delims.items(): if key in s: # 用strip()去掉别名前后空格,让结果更整洁 akas[col_name] = s.split(key, 1)[1].strip() return akas
2. 修正apply与get的使用方式
df["name"].apply(get_akas)返回的是Series对象,每个元素是字典。直接调用Series的get方法是按索引取值,而非对每个字典元素调用get。需要用apply逐个处理字典:
# 先生成包含所有别名信息的字典列 alias_dicts = df["name"].apply(get_akas) # 从字典中提取对应字段,不存在则返回空字符串 df["aka"] = alias_dicts.apply(lambda x: x.get("aka", "")) df["lqaka"] = alias_dicts.apply(lambda x: x.get("lqaka", ""))
更高效的替代方案(无需自定义函数)
直接用Pandas的str.extract正则提取,代码更简洁且性能更好:
# 提取alias后的内容,无匹配则填充空字符串 df["aka"] = df["name"].str.extract(r'alias\s*(.*)', expand=False).fillna("") # 提取@后的内容,无匹配则填充空字符串 df["lqaka"] = df["name"].str.extract(r'@\s*(.*)', expand=False).fillna("")
内容的提问来源于stack exchange,提问作者nzskra
相关产品推荐
相关产品推荐

