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

如何在Pandas中处理JSON嵌套列表并转换为Numpy数组

处理lsblk嵌套JSON数据:扁平化结构并转换为无嵌套Numpy数组

问题背景

通过lsblk命令获取块设备的JSON数据,使用pd.json_normalize解析后,DataFrame中存在嵌套的children列,转换为Numpy数组后仍保留嵌套字典列表结构,需要将所有嵌套的子设备展开,与父设备并列展示,最终得到无嵌套的Numpy数组。

现有代码

def return_pandas():
    process = subprocess.run("lsblk --json -o NAME,SIZE,UUID,MOUNTPOINT,PATH,FSTYPE ".split(), capture_output=True, text=True)
    data = json.loads(process.stdout)
    return pd.json_normalize(data['blockdevices'])

json_pandas = return_pandas()

解决方案

核心思路是通过递归遍历提取所有层级的设备(包括嵌套的children),将每个设备转换为独立的字典,最终生成扁平化的DataFrame,再转换为无嵌套的Numpy数组。

1. 递归扁平化函数

编写递归函数遍历所有设备节点,收集每个设备的信息:

def flatten_devices(devices, parent=None):
    flat_list = []
    for dev in devices:
        # 复制当前设备数据,排除children字段
        dev_data = {key: value for key, value in dev.items() if key != 'children'}
        # 可选:添加parent字段追踪设备层级关系
        if parent:
            dev_data['parent'] = parent
        flat_list.append(dev_data)
        # 递归处理子设备
        if 'children' in dev and dev['children']:
            flat_list.extend(flatten_devices(dev['children'], parent=dev['name']))
    return flat_list

2. 修改数据处理函数

整合递归函数,生成扁平化的DataFrame:

import subprocess
import json
import pandas as pd
import numpy as np

def return_flattened_pandas():
    process = subprocess.run("lsblk --json -o NAME,SIZE,UUID,MOUNTPOINT,PATH,FSTYPE ".split(), capture_output=True, text=True)
    data = json.loads(process.stdout)
    # 扁平化所有设备数据
    flat_devices = flatten_devices(data['blockdevices'])
    return pd.DataFrame(flat_devices)

3. 生成扁平化DataFrame与Numpy数组

调用函数并转换为Numpy数组:

# 获取扁平化DataFrame
flat_df = return_flattened_pandas()
print(flat_df)

# 转换为无嵌套的Numpy数组
flat_np_array = flat_df.to_numpy()
print(flat_np_array)

处理后效果示例

扁平化后的DataFrame将所有子设备展开为独立行,示例如下:

name   size                                   uuid mountpoint                     path     fstype parent
0          sda    25G                                   None       None                  /dev/sda      None   None
1          sdb    25G                                   None       None                  /dev/sdb      None   None
2         sdb1   512M                             0087-DF28  /boot/efi                /dev/sdb1       vfat    sdb
3         sdb2   488M  bd51147c-8f8c-4d3a-afde-4ebf67ae4558    /boot                /dev/sdb2       ext2    sdb
4         sdb3    24G  d07d17bf-ebbd-491a-b57c-f9d43b7e6be5       None                /dev/sdb3  crypto_LUKS    sdb
5  sda3_crypt    24G  3NbbDi-BtQ4-PXzK-NVBO-cR2d-aLzZ-pzh0A5       None  /dev/mapper/sda3_crypt  LVM2_member   sdb3
6  kali--vg-root    23G  6bc26692-9b22-4d38-b1c0-53e99326e9d5         /  /dev/mapper/kali--vg-root       ext4 sda3_crypt
7 kali--vg-swap_1   980M  3eb8e4cc-56bb-4b5b-b2a8-bc7ac016df67    [SWAP] /dev/mapper/kali--vg-swap_1        swap sda3_crypt
8          sr0  1024M                                   None       None                  /dev/sr0      None   None

转换后的Numpy数组将不再包含嵌套结构,所有元素均为基础数据类型,可直接用于CurseXcel等第三方项目处理。

内容的提问来源于stack exchange,提问作者amadecember

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:36:06