如何在Python中对含JSON格式文本的行进行分组分类
解决方案:将JSON文本列统一分类标记到单列
核心思路
直接匹配完整JSON字符串的方式扩展性差,建议优先解析JSON提取关键特征来定义分类规则,或者用np.select整合原有的匹配逻辑,生成统一的分类标记列。
方案1:解析JSON提取特征分类(推荐)
先把JSON文本转成可操作的字典,通过关键字段特征区分类别,灵活性更强:
import pandas as pd import json import numpy as np # 读取数据 df = pd.read_excel('./sourcefile - 2023-03-10T161929.976.xlsx') # 解析JSON列,处理解析失败的情况 def parse_json(text): try: return json.loads(text) except: return {} df['parsed_json'] = df['Textcolumn_name'].apply(parse_json) # 定义分类条件与对应标记 conditions = [ # 匹配示例1:61号Classifier含特定字符串,且65号Classifier含指定前缀 (df['parsed_json'].apply(lambda x: 'roas!pconv!PA!0601-0628!remove_fea' in x.get('61', {}).get('ClassifierName', '')) & df['parsed_json'].apply(lambda x: x.get('65', {}).get('ClassifierName', '').startswith('CP!en-us!Cascade'))), # 匹配示例2:61号Classifier含特定字符串,且65号Classifier为指定值 (df['parsed_json'].apply(lambda x: 'roas_pconv!PA!NN!4weektill20200928' in x.get('61', {}).get('ClassifierName', '')) & df['parsed_json'].apply(lambda x: x.get('65', {}).get('ClassifierName', '') == 'ROASScorePrediction.ini')) # 可继续添加其他6-8种分类条件 ] labels = ['1/A', '2/B'] # 对应条件的分类标记 # 生成分类列 df['Cat'] = np.select(conditions, labels, default='其他')
方案2:直接匹配完整字符串生成分类列
如果JSON格式完全固定,可直接整合原有的匹配逻辑,避免多mask列:
import pandas as pd import numpy as np df = pd.read_excel('./sourcefile - 2023-03-10T161929.976.xlsx') # 定义每个类别对应的匹配字符串与标记 match_list = [ # 示例1的完整JSON字符串 '{"23":{"ClassifierName":"CP!nativeads!PA!pconv!0604-0701.ini","CountModelIds":"1190"},"61":{"ClassifierName":"CP!nativeads!roas!pconv!PA!0601-0628!remove_fea.ini","CountModelIds":"1185;1186"},"63":{"ClassifierName":"CP!nativeads!roas!gv!v2!PA!NN!0601-0628.ini","CountModelIds":"1187;1188;1189"},"65":{"ClassifierName":"CP!en-us!Cascade!PA!ROAS_ScorePrediction0628Update.ini"}}', # 示例2的完整JSON字符串 '{"23":{"ClassifierName":"CP!nativeads!PA!pconv!0604-0701.ini","CountModelIds":"1190"},"61":{"ClassifierName":"CP!nativeads!roas_pconv!v2!PA!NN!OfferSelectionMask!roasonly4weektill20210707.ini","CountModelIds":"1185;1186"},"63":{"ClassifierName":"CP!nativeads!roas_gv!v2!PA!NN!withTA4weeksTill20210707.ini","CountModelIds":"1187;1188;1189"},"65":{"ClassifierName":"ROASScorePrediction.ini"}}' ] labels = ['1/A', '2/B'] # 生成条件列表 conditions = [df['Textcolumn_name'].str.contains(s, case=False, na=False) for s in match_list] # 生成统一分类列 df['Cat'] = np.select(conditions, labels, default='其他')
说明
- 方案1适合JSON结构固定但字段内容有规律变化的场景,后续新增类别只需调整特征匹配规则,无需复制冗长字符串;
- 方案2适合JSON内容完全固定的场景,逻辑简单但扩展性弱;
- 可根据实际需求扩展
conditions和labels列表,覆盖6-8种分类场景。
内容的提问来源于stack exchange,提问作者Shivi Bhatia
相关产品推荐
相关产品推荐

