如何将数据集中存储JSON键值对列表的列拆分为多列?
当然可以!这种把嵌套JSON数组展开为结构化列的需求非常常见,下面我会给出几种主流技术栈的实现方案,你可以根据自己的使用场景选择:
Python Pandas 实现
如果你的数据是用Pandas DataFrame存储的,可以通过解析JSON、展开数组再透视的方式完成转换:
import pandas as pd import json # 模拟你的数据集 data = { "ID": [1], "Settings": ['[{"key":"key1","value":"val1"}, {"key":"key2","value":"val2"}, {"key":"key3","value":"val3"}]'] } df = pd.DataFrame(data) # 解析Settings列的JSON字符串为Python列表 df['Settings'] = df['Settings'].apply(json.loads) # 展开JSON数组,将每个key-value对转为行,再透视成列 settings_expanded = df['Settings'].apply(pd.Series).melt(value_name='kv_pair').dropna() settings_pivoted = settings_expanded['kv_pair'].apply(pd.Series).pivot(columns='key', values='value').reset_index(drop=True) # 合并回原数据集 final_df = pd.concat([df.drop('Settings', axis=1), settings_pivoted], axis=1) print(final_df)
运行后你会得到结构化的结果:
| ID | key1 | key2 | key3 |
|---|---|---|---|
| 1 | val1 | val2 | val3 |
PostgreSQL 实现
如果数据存储在PostgreSQL数据库中,可以利用其原生的JSON函数和交叉表功能完成转换:
-- 创建示例表并插入数据 CREATE TABLE test_data ( ID INT, Settings JSONB ); INSERT INTO test_data VALUES (1, '[{"key":"key1","value":"val1"}, {"key":"key2","value":"val2"}, {"key":"key3","value":"val3"}]'); -- 展开JSON数组并转换为宽表 SELECT * FROM crosstab( 'SELECT ID, s->>''key'' AS key, s->>''value'' AS value FROM test_data, jsonb_array_elements(Settings) AS s ORDER BY 1, 2', 'SELECT DISTINCT s->>''key'' FROM test_data, jsonb_array_elements(Settings) AS s ORDER BY 1' ) AS ct(ID INT, key1 TEXT, key2 TEXT, key3 TEXT);
这个查询会直接返回你需要的结构化结果集。
核心思路总结
不管用哪种工具,核心步骤都是一致的:
- 解析JSON格式的字符串为可操作的数组/对象
- 将数组展开为多行(每行对应一个key-value对)
- 将多行数据透视(pivot)为宽表,把key作为列名,value作为对应单元格的值
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

