将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,需实现全量数据集处理。
解决方案
步骤说明
- 填充跨行空值:原始数据中
col1和col3存在跨行空值,用ffill()向下填充补全。 - 整理JSON格式:将同一组的
col2字符串合并为合法的JSON数组,确保json.loads()可解析。 - 拆分字典列表:用
explode()将每个字典拆分为单独行。 - 展开字典为列:用
json_normalize()将字典的键转换为独立列。 - 合并并调整列顺序:整合原列与展开后的列,匹配目标格式。
代码实现
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
相关产品推荐
相关产品推荐

