在Pandas中比对JSON字符串并按匹配结果打API变更标签
Pandas DataFrame API兼容性标记实现方案
先来理清楚核心逻辑:按照优先级判断——先看diff2是不是空值,再检查diff2里的所有API关键词是否都能在diff里找到,最后判断是否存在匹配但diff还有额外内容的情况。
具体实现步骤
1. 数据预处理
- 解析
diff列的JSON:如果diff存的是JSON字符串,先转成Python可遍历的对象(字典/列表),之后转成字符串方便关键词匹配;要是已经是Python对象,直接转字符串就行。 - 提取
diff2中的API关键词:因为diff2都是以API开头的文本,用正则提取所有API相关标识,比如API_xxx、API-xxx这类,正则可以根据实际文本格式调整。
2. 编写标记函数
写一个自定义函数,逐行处理DataFrame的数据:
import pandas as pd import json import re def mark_compatibility(row): # 规则1:diff2为空值,直接标记为Non-Breaking if pd.isna(row['diff2']): return 'Non-Breaking' # 解析diff的JSON数据(如果是字符串格式的话) try: diff_data = json.loads(row['diff']) if isinstance(row['diff'], str) else row['diff'] diff_str = json.dumps(diff_data) except json.JSONDecodeError: # 万一JSON解析失败,默认按非破坏性变更处理,可按需调整 return 'Non-Breaking' # 从diff2中提取API关键词,正则可根据实际API格式修改 api_keywords = re.findall(r'API[\w-]+', row['diff2']) if not api_keywords: # 没提取到关键词,按Non-Breaking处理 return 'Non-Breaking' # 检查diff2的所有关键词是否都在diff里 all_matched = all(keyword in diff_str for keyword in api_keywords) # 提取diff里的所有API关键词,对比是否有diff2没覆盖的内容 diff_api_keywords = re.findall(r'API[\w-]+', diff_str) extra_in_diff = set(diff_api_keywords) - set(api_keywords) if all_matched and not extra_in_diff: # 规则2:所有关键词都匹配,且diff没有额外API变更,标记Breaking return 'Breaking' elif all_matched and extra_in_diff: # 规则3:关键词都匹配,但diff还有额外内容,标记Both return 'Both' else: # 有diff2的关键词不在diff里,按Non-Breaking处理,可按需调整 return 'Non-Breaking'
3. 应用函数到DataFrame
把上面的函数作用到DataFrame的每一行,生成新的标记列:
# 假设你的DataFrame名为df df['compatibility_mark'] = df.apply(mark_compatibility, axis=1)
注意事项
- JSON解析适配:如果
diff列本来就是Python字典/列表,直接跳过json.loads步骤,转成字符串就行。 - 正则规则调整:如果你的API命名格式特殊(比如带点号、下划线之外的符号),要修改正则表达式,确保能准确提取关键词。
- 精确匹配优化:如果需要更严谨的对比,不要只靠字符串匹配,可以解析
diff的JSON结构,逐个核对变更项和diff2的关键词,这样结果更准确。
内容的提问来源于stack exchange,提问作者Brie MerryWeather
相关产品推荐
相关产品推荐

