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

如何用Pandas和Numpy按dps字段区分LED灯与开关设备

嵌套JSON设备分类的Pandas处理方案

问题分析

核心需求很明确:从API返回的嵌套JSON数据里,依据dps字段的键值区分11台设备——只要dps里有1就是开关设备,有20就是LED灯设备,最终要把两类设备分开处理。

分步解决方法

1. 先把嵌套JSON解析成DataFrame

API返回的JSON是嵌套结构,直接用pd.json_normalize()就能把嵌套的字段展开,方便后续操作:

import pandas as pd

# 假设你的原始JSON数据存在data变量里
df = pd.json_normalize(data)

2. 按dps键值筛选分类

直接对dps列用apply判断键是否存在,就能快速拆分两类设备:

# 筛选开关设备(dps包含键'1')
switch_devices = df[df['dps'].apply(lambda x: '1' in x.keys())]

# 筛选LED灯设备(dps包含键'20')
led_devices = df[df['dps'].apply(lambda x: '20' in x.keys())]

3. 验证结果

可以打印两类设备的数量,确认是否覆盖所有11台设备:

print(f"开关设备数量:{len(switch_devices)}")
print(f"LED灯设备数量:{len(led_devices)}")

常见踩坑排查

如果之前的代码没成功,大概率是这几个原因:

  • 键的类型不匹配:JSON里的dps键可能是字符串(比如'1')而不是数字1,一定要和你实际数据里的键类型对应。
  • JSON没正确展开:如果dps是深层嵌套的结构,要确保json_normalize正确解析到这个字段,或者手动提取dps列。
  • 设备类型重叠:如果有设备同时包含dps.1和dps.20,上面的代码会把它分到两个DataFrame里,要是想分开纯开关/纯LED设备,就改下筛选条件:
    # 只保留仅含dps.1的开关设备
    pure_switch = df[df['dps'].apply(lambda x: '1' in x and '20' not in x)]
    # 只保留仅含dps.20的LED设备
    pure_led = df[df['dps'].apply(lambda x: '20' in x and '1' not in x)]
    

完整示例代码

假设你的JSON数据长这样:

[
  {"device_id": "dev001", "dps": {"1": true, "3": "auto"}},
  {"device_id": "dev002", "dps": {"20": 70, "21": "cool"}},
  {"device_id": "dev003", "dps": {"1": false, "20": 100}}
]

完整处理代码:

import pandas as pd

# 示例JSON数据
data = [
  {"device_id": "dev001", "dps": {"1": True, "3": "auto"}},
  {"device_id": "dev002", "dps": {"20": 70, "21": "cool"}},
  {"device_id": "dev003", "dps": {"1": False, "20": 100}}
]

# 解析JSON到DataFrame
df = pd.json_normalize(data)

# 分类设备
switch_devices = df[df['dps'].apply(lambda x: '1' in x)]
led_devices = df[df['dps'].apply(lambda x: '20' in x)]

# 输出结果
print("开关设备列表:")
print(switch_devices[['device_id', 'dps']])
print("\nLED灯设备列表:")
print(led_devices[['device_id', 'dps']])

运行后会输出:

开关设备列表:
  device_id                        dps
0    dev001  {'1': True, '3': 'auto'}
2    dev003  {'1': False, '20': 100}

LED灯设备列表:
  device_id                        dps
1    dev002  {'20': 70, '21': 'cool'}
2    dev003  {'1': False, '20': 100}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:43:13