Python读取JSON转为DataFrame后按关键字段筛选数据的问题
解决JSON转DataFrame后的筛选问题
你当前遇到的核心问题是读取JSON的方式不对,导致生成的DataFrame是嵌套结构(每个年份列存的是字典列表),没法直接按DayofWeek或Year这类字段筛选。咱们先把数据转换成标准的扁平化结构,再做筛选就轻松多了。
第一步:正确读取并扁平化JSON数据
你的原始JSON是以年份为键,每个键对应一组包含详细字段的列表。我们需要把这些嵌套数据展开成行式DataFrame,让每个字段对应单独的列:
import pandas as pd import json with open('sample.json') as json_data: data = json.load(json_data) # 遍历所有年份的条目,把嵌套数据展开成扁平字典 flat_data = [] for year, entries in data.items(): for entry in entries: flat_data.append(entry) # 生成标准结构的DataFrame df = pd.DataFrame(flat_data)
运行后df的结构会是这样的:
| DayofWeek | Date | Year | y | x | Minute |
|---|---|---|---|---|---|
| 4 | 2015-02-06 00:00:00 | 2015 | 43.2 | 10.397 | NaN |
| 4 | 2016-02-06 00:00:00 | 2016 | 43.2 | 10.397 | 0 |
| 4 | 2017-02-06 00:00:00 | 2017 | 43.2 | 10.397 | 0 |
第二步:按场景筛选数据
场景1:筛选所有DayofWeek=4的数据
直接用布尔索引就能完成筛选:
filtered_scenario1 = df[df['DayofWeek'] == 4]
场景2:筛选Year=2017且DayofWeek=4的数据
组合多个条件时,记得用括号包裹每个条件,用&表示逻辑与:
filtered_scenario2 = df[(df['Year'] == 2017) & (df['DayofWeek'] == 4)]
补充:用pd.json_normalize简化扁平化步骤
如果你觉得手动遍历太繁琐,也可以用pd.json_normalize直接处理,只需先把所有年份的列表合并成一个大列表:
all_entries = [] for entries in data.values(): all_entries.extend(entries) df = pd.json_normalize(all_entries)
得到的DataFrame和手动遍历的结果完全一致,后续筛选逻辑也相同。
内容的提问来源于stack exchange,提问作者niran
相关产品推荐
相关产品推荐

