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

