将含嵌套JSON的CSV转换为Pandas DataFrame并拆分嵌套列
拆分CSV中嵌套JSON列的解决方案
我刚好处理过类似的DynamoDB格式嵌套JSON数据,给你一步步来解决:
步骤1:加载CSV并解析JSON字符串
首先用Pandas加载你的CSV文件,然后把data列里的JSON字符串转换成Python字典:
import pandas as pd import json # 替换成你的CSV文件路径 df = pd.read_csv('your_data.csv') # 将data列的JSON字符串解析为字典 df['data'] = df['data'].apply(json.loads)
步骤2:处理DynamoDB格式的嵌套值
你的JSON看起来是DynamoDB的存储格式(每个值都带类型标识,比如{"N": "3377"}),所以需要先提取出实际的数值/字符串。写一个小函数来处理这个:
def get_actual_value(dynamo_item): """从DynamoDB格式的键值对中提取实际值""" if isinstance(dynamo_item, dict): # DynamoDB每个属性只会有一个类型键(N/S/B等),直接取第一个值即可 return next(iter(dynamo_item.values())) return dynamo_item
然后把data列里的每个字典都用这个函数处理一遍:
# 处理所有嵌套的DynamoDB格式值 processed_data = df['data'].apply( lambda item: {key: get_actual_value(value) for key, value in item.items()} )
步骤3:展开嵌套字典为独立列
用pd.json_normalize把处理后的字典展开成单独的列,再和原DataFrame合并:
# 展开嵌套字典为DataFrame expanded_df = pd.json_normalize(processed_data) # 和原表合并,去掉原来的data列 final_df = pd.concat([df.drop('data', axis=1), expanded_df], axis=1)
示例效果
比如你的原数据中某一行的data列是:
{ "deviceId" : { "N" : "3377" }, "temperature" : { "N" : "22.3" }, "status" : { "S" : "online" } }
处理后会新增deviceId、temperature、status三列,对应的值分别是3377、22.3、online,和原表的deviceId、timestamp列完美合并。
如果你的JSON有更深层次的嵌套(比如{"metrics": {"humidity": {"N": "60"}}}),json_normalize会自动用.分隔嵌套层级,生成metrics.humidity这样的列名,非常方便。
内容的提问来源于stack exchange,提问作者Steven Miller
相关产品推荐
相关产品推荐

