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

将Pandas中存字典列表字符串的列拆分为多行及多列

问题描述

原始DataFrame如下:

col1                             col2                           col3    
usr_entry   {"key_1":"i89","key_2":"desktop","key_3":100},   2023-08-01   
            {"key_1":"i254","key_2":"mobile","key_3":"67"}

需要将col2拆分为单独行,并从字典的键生成新列,得到结果:

col1     key_1   key_2   key_3     col3
usr_entry   i89   desktop   100   2023-08-01
usr_entry   i254  mobile    67    2023-08-01

尝试用json.loads()转换col2但失败,因为col2是Pandas Series,需实现全量数据集处理。

解决方案

步骤说明

  1. 填充跨行空值:原始数据中col1和col3存在跨行空值,用ffill()向下填充补全。
  2. 整理JSON格式:将同一组的col2字符串合并为合法的JSON数组,确保json.loads()可解析。
  3. 拆分字典列表:用explode()将每个字典拆分为单独行。
  4. 展开字典为列:用json_normalize()将字典的键转换为独立列。
  5. 合并并调整列顺序:整合原列与展开后的列,匹配目标格式。

代码实现

import pandas as pd
import json

# 构造示例数据集(模拟用户原始数据)
df = pd.DataFrame({
    'col1': ['usr_entry', None],
    'col2': ['{"key_1":"i89","key_2":"desktop","key_3":100},', '{"key_1":"i254","key_2":"mobile","key_3":"67"}'],
    'col3': ['2023-08-01', None]
})

# 1. 填充跨行空值
df['col1'] = df['col1'].ffill()
df['col3'] = df['col3'].ffill()

# 2. 分组合并并整理col2为合法JSON数组
df_grouped = df.groupby(['col1', 'col3'])['col2'].apply(
    lambda x: '[' + ','.join([s.rstrip(',') for s in x]) + ']'
).reset_index()

# 解析JSON数组为字典列表
df_grouped['col2'] = df_grouped['col2'].apply(json.loads)

# 3. 拆分行
df_exploded = df_grouped.explode('col2', ignore_index=True)

# 4. 展开字典为列
df_final = pd.concat(
    [df_exploded[['col1', 'col3']], pd.json_normalize(df_exploded['col2'])],
    axis=1
)

# 5. 调整列顺序
df_final = df_final[['col1', 'key_1', 'key_2', 'key_3', 'col3']]

print(df_final)

输出结果

col1 key_1    key_2 key_3        col3
0  usr_entry   i89  desktop   100  2023-08-01
1  usr_entry  i254   mobile    67  2023-08-01

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:22:29