如何在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
相关产品推荐
相关产品推荐

