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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:31:18