Python从嵌套字典中提取特定文本:提取含ft/mi/FT/MI的距离值并新增distance字段
解决嵌套结构中提取距离信息并添加新字段的问题
看起来你需要处理嵌套的字典列表(或Pandas DataFrame中的嵌套列),从每个子字典的state字段中提取带ft/mi/FT/MI的距离值,并添加到新的distance字段里。我来帮你修正代码逻辑,解决这个问题:
问题分析
你的原始代码没有正确处理嵌套结构——state字段并不是DataFrame的直接列,而是嵌套在class1列表的子字典中。直接对df['state']操作会报错,也无法遍历到每个子元素。
解决方案
根据你的数据结构,我提供两种常用场景的解决方法:
1. 纯Python字典列表处理
如果你的数据是原生Python列表字典,直接遍历嵌套结构并用正则提取即可:
import re import json # 你的原始数据 data = [ { "id": 1243, "class1": [ {"count":5, "state": "Arizona 4.47ft" }, { "state": "Georgia 1023mi" } ] }, { "id": 12438, "class1": [ {"count":2, "state": "Newyork 2022 NY 74.6 FT" }, { "state": "Indiana 747MI(In)" }, {"count":2, "state": "Florida 453mi FL" } ] } ] # 定义正则:匹配整数/小数 + 可选空格 + 目标单位(保留原大小写) distance_pattern = re.compile(r'(\d+\.?\d*\s?(?:ft|mi|FT|MI))') # 遍历每个顶层元素 for top_item in data: # 遍历class1中的每个子字典 for sub_item in top_item['class1']: # 从state字符串中匹配距离 match_result = distance_pattern.search(sub_item['state']) if match_result: # 添加distance字段,去除可能的多余空格 sub_item['distance'] = match_result.group(1).strip() # 打印处理后的结果 print(json.dumps(data, indent=2))
2. Pandas DataFrame处理
如果你的数据已经存入Pandas DataFrame(从代码中的df推测),可以用apply函数处理嵌套的class1列:
import pandas as pd import re # 构造示例DataFrame df = pd.DataFrame([ { "id": 1243, "class1": [ {"count":5, "state": "Arizona 4.47ft" }, { "state": "Georgia 1023mi" } ] }, { "id": 12438, "class1": [ {"count":2, "state": "Newyork 2022 NY 74.6 FT" }, { "state": "Indiana 747MI(In)" }, {"count":2, "state": "Florida 453mi FL" } ] } ]) distance_pattern = re.compile(r'(\d+\.?\d*\s?(?:ft|mi|FT|MI))') # 定义处理每个class1列表的函数 def process_class_list(class_list): for sub_dict in class_list: match = distance_pattern.search(sub_dict['state']) if match: sub_dict['distance'] = match.group(1).strip() return class_list # 对class1列应用处理函数 df['class1'] = df['class1'].apply(process_class_list) # 输出处理后的结果 print(df.to_json(orient='records', indent=2))
正则表达式说明
\d+\.?\d*:匹配整数(如1023)或小数(如4.47、74.6)\s?:匹配可选的空格,兼容74.6 FT这种带空格的格式(?:ft|mi|FT|MI):非捕获组,精准匹配四种单位,保留原始大小写(比如不会把FT转成ft)
原始代码的问题总结
- 错误地尝试直接访问
df['state'],但state是嵌套在class1的子字典中,不是DataFrame的直接列 - 没有遍历嵌套的
class1列表,无法处理每个子元素的state字段
内容的提问来源于stack exchange,提问作者user18632871
相关产品推荐
相关产品推荐

