You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:25:46