如何在Pandas DataFrame中展开JSON格式的event_params并保留键值?
解决方案
要将event_params列的JSON对象展开为包含键值对的关系型格式,同时保留原行的所有关联字段,你可以通过以下两种Pandas实现方法解决:
方法一:行遍历拼接小DataFrame
适合需要对空字典做自定义处理的场景:
import pandas as pd import json # 预处理:将单引号格式的JSON字符串转为标准字典(替换单引号为双引号后用json.loads更安全) a_df['event_params'] = a_df['event_params'].str.replace("'", "\"").apply(json.loads) def expand_params(row): params = row['event_params'] # 处理空字典的情况,返回带空值的行 if not params: return pd.DataFrame({ 'date_time': [row['date_time']], 'user_id': [row['user_id']], 'account_id': [row['account_id']], 'event_name': [row['event_name']], 'param_key': [None], 'param_value': [None] }) # 将字典的键值对转为DataFrame,并合并原行的其他字段 params_df = pd.DataFrame(params.items(), columns=['param_key', 'param_value']) for col in ['date_time', 'user_id', 'account_id', 'event_name']: params_df[col] = row[col] return params_df # 拼接所有行的处理结果 expanded_df = pd.concat([expand_params(row) for _, row in a_df.iterrows()], ignore_index=True)
方法二:explode拆分键值对列表
更简洁高效的通用方案:
import pandas as pd import json # 预处理转为字典 a_df['event_params'] = a_df['event_params'].str.replace("'", "\"").apply(json.loads) # 将字典转为键值对元组的列表(空字典则转为包含空元组的列表) a_df['param_pairs'] = a_df['event_params'].apply(lambda x: list(x.items()) if x else [(None, None)]) # 炸开列表,每个元组单独成一行 exploded_df = a_df.explode('param_pairs', ignore_index=True) # 将元组拆分为单独的键、值列 exploded_df[['param_key', 'param_value']] = pd.DataFrame(exploded_df['param_pairs'].tolist(), index=exploded_df.index) # 清理不需要的中间列 exploded_df = exploded_df.drop(columns=['event_params', 'param_pairs'])
关键说明
你之前直接用explode()处理字典时,Pandas会默认将字典的键作为可迭代元素展开,因此丢失了对应的值。上述两种方法都是先将字典转换为包含键值对的可迭代结构(小DataFrame或元组列表),再进行展开,从而完整保留键与值的对应关系。
内容的提问来源于stack exchange,提问作者Cold Fish
相关产品推荐
相关产品推荐

