如何使用pandas从单元格中提取iso_639_1语言编码并丢弃其余内容
实现步骤
首先确认你的spoken languages列存储格式,分两种场景处理:
场景1:列值为JSON格式字符串(大部分从csv/数据库直接读入的情况)
你给出的示例字符串包含中文双引号,需要先替换为英文双引号再解析:
- 导入依赖库
import pandas as pd import json
- 解析字符串后提取编码
# 假设你的数据集已读入为df变量 # 先替换中文引号为英文引号,避免JSON解析报错 df['spoken languages'] = df['spoken languages'].str.replace('“', '"').str.replace('”', '"') # 把JSON字符串解析为列表嵌套字典的Python对象 df['lang_obj'] = df['spoken languages'].apply(lambda x: json.loads(x)) # 提取所有iso_639_1编码,同一条数据的多个编码默认存为列表 df['iso_codes'] = df['lang_obj'].apply(lambda x: [item['iso_639_1'] for item in x])
如果你需要把同一条数据的多个编码拆分为单独的行,额外增加一行代码即可:
df_exploded = df.explode('iso_codes')
场景2:列值已经是列表嵌套字典的Python对象
直接提取编码即可:
df['iso_codes'] = df['spoken languages'].apply(lambda x: [item['iso_639_1'] for item in x])
可选方案:正则提取(无需解析JSON,效率更高)
如果你不想处理JSON解析逻辑,也可以直接用正则匹配编码内容,兼容中英文引号:
df['iso_codes'] = df['spoken languages'].str.findall(r'[“"]iso_639_1[“"]:\s*[“"]([a-z]{2})[“"]')
该方案适合数据量较大的清洗场景。
内容的提问来源于stack exchange,提问作者Mohamed Aman
相关产品推荐
相关产品推荐

