如何更简洁地将指定JSON转换为Pandas DataFrame?
简化JSON转Pandas DataFrame的方案
我通过查询获取了如下JSON数据,需要将其中的groupData块转换为指定格式的Pandas DataFrame。目前已实现一套较为繁琐的转换方案,现寻求更简洁高效的解决办法。
原始JSON
r = {'metaData': [{'columnAliases': ['ltp', 'mcap', 'wsma30uptrend','15 day contraction'], 'availableLimit': 477, 'maxRows': 1, 'isTrend': True, 'limit': 2, 'groups': ['symbol'], 'tradeTimes': [1692210600000], 'lastUpdateTime': 1692266340000}], 'groups': ['BALRAMCHIN', 'GHCL'], 'time': 138, 'groupData': [{'name': 'BALRAMCHIN', 'results': [{'ltp': [394.6]}, {'mcap': [7938.8328]}, {'wsma30uptrend': [1]}, {'15 day contraction': [9.478]}]}, {'name': 'GHCL', 'results': [{'ltp': [516.1]}, {'mcap': [5048.8412]}, {'wsma30uptrend': [1]}, {'15 day contraction': [9.5524]}]}]}
期望输出
name ltp mcap wsma30uptrend 15 day contraction BALRAMCHIN 394.6 7938.83 1 9.478 GHCL 516.1 5048.84 1 9.5524
现有方案代码
df = pd.DataFrame(r['groupData']) df = pd.concat([df.drop(['results'], axis=1), df['results'].apply(pd.Series)], axis=1) for i in range(0, 4): df = pd.concat([df.drop([i], axis=1), df[i].apply(pd.Series)], axis=1) df = df.explode('ltp') df = df.explode('mcap') df = df.explode('wsma30uptrend') df = df.explode('15 day contraction')
优化后的简洁方案
可以通过遍历groupData中的每个条目,把name和results里的字段合并成字典,再直接构建DataFrame,同时处理列表取值和小数格式化:
import pandas as pd # 提取groupData数据 group_data = r['groupData'] # 遍历每个条目,整理成标准字典格式 processed_data = [] for item in group_data: row = {'name': item['name']} # 合并results里的每个字典,取出列表中的唯一值 for res in item['results']: key = list(res.keys())[0] row[key] = res[key][0] processed_data.append(row) # 构建DataFrame并格式化小数位数 df = pd.DataFrame(processed_data) df['mcap'] = df['mcap'].round(2) print(df.to_string(index=False))
思路说明
- 直接遍历
groupData的每个元素,无需多次拼接DataFrame,减少内存开销和代码复杂度 - 对每个
results里的字典,提取键和对应列表的第一个值(因为每个列表只有一个元素) - 最后统一构建DataFrame,按需格式化小数位数,一步到位得到目标格式
内容的提问来源于stack exchange,提问作者Tedla
相关产品推荐
相关产品推荐

