如何用Pandas读取嵌套JSON并构建(plantId,时间)索引的NumPy矩阵
问题描述
我有如下嵌套JSON字符串:
{ "2022-09-28T00:45:00.000Z": [ { "value": 0.216, "plantId": "27050937", "man": "pippo" }, { "value": 0.224, "plantId": "30082443", "man": "pippo" } ], "2022-09-28T00:30:00.000Z": [ { "value": 0.248, "plantId": "27050937", "man": "pippo" }, { "value": 0.108, "plantId": "30082443", "man": "pippo" } ] }
希望导入数据后构建以(plantId, 时间)为索引的NumPy矩阵,预期输出示例:
30082443 0.216 0.108 27050937 0.224 0.248 ....
尝试用Pandas读取:
a = pd.read_json("./data.json",orient='index')
得到的结果不符合预期:
2022-09-28 00:45:00+00:00 {'value': 0.216, 'plantId': '27050937', 'man... {'value': 0.224, 'plantId': '30082443', 'man... 2022-09-28 00:30:00+00:00 {'value': 0.248, 'plantId': '27050937', 'man... {'value': 0.108, 'plantId': '30082443', 'man...
解决方案
步骤1:扁平化嵌套JSON
原JSON的时间键对应列表数据,直接读取会导致列表被当作单元格内容。先将数据展开为结构化表格:
import pandas as pd import numpy as np # 读取JSON并展开嵌套列表 df = pd.read_json("./data.json", orient='index').stack().reset_index() df.columns = ['timestamp', 'idx', 'data'] # 把嵌套字典拆分为独立列 df = pd.concat([df.drop('data', axis=1), df['data'].apply(pd.Series)], axis=1)
步骤2:构建透视表
以plantId为行、时间为列,value为填充值,生成透视表:
pivot_df = df.pivot(index='plantId', columns='timestamp', values='value')
步骤3:转换为NumPy矩阵
将透视表的索引(plantId)和数值数据组合成目标矩阵:
# 组合plantId与数值数组 numpy_matrix = np.hstack([pivot_df.index.values.reshape(-1, 1), pivot_df.values]) # 按示例格式输出 for row in numpy_matrix: print(f" {row[0]} {' '.join(map(str, row[1:]))}")
完整代码
import pandas as pd import numpy as np # 读取并扁平化数据 df = pd.read_json("./data.json", orient='index').stack().reset_index() df.columns = ['timestamp', 'idx', 'data'] df = pd.concat([df.drop('data', axis=1), df['data'].apply(pd.Series)], axis=1) # 构建透视表并转换为NumPy矩阵 pivot_df = df.pivot(index='plantId', columns='timestamp', values='value') numpy_matrix = np.hstack([pivot_df.index.values.reshape(-1,1), pivot_df.values]) # 输出结果 for row in numpy_matrix: print(f" {row[0]} {' '.join(map(str, row[1:]))}")
最终输出
27050937 0.216 0.248 30082443 0.224 0.108
内容的提问来源于stack exchange,提问作者gdm
相关产品推荐
相关产品推荐

