python - 将嵌套的 JSON 转换为 Pandas df
问题描述
我有一个如下所示的 JSON:
{
"4.0": {
"A1": {
"dR-14": 1.181,
"ev": 1.102,
"move11": 1.259,
"move6": 1.259,
"sILo": 1.259,
"tR-14": 1.04
},
"A2": {
"dR-03": 0.418,
"ev": -0.177,
"move11": 1.663,
"move6": 1.663,
"sILo": 0.418,
"tR-03": 0.818
},
"A3": {
"dR-16": 3.956,
"ev": 3.667,
"move11": 4.179,
"sILo": 4.246,
"tR-16": 3.465
},
...
我正试图把它变成一个看起来像这样的熊猫 df
var1 var2 dR ev move11 move6 sILo tR
4.0 A1 1.181 1.102 1.259 1.259 1.259 1.04
4.0 A2 0.418 -0.177 1.663 1.663 0.418 0.818
4.0 A3 3.956 3.667 4.179 NaN 4.246 3.465
我试过像这样使用 pandas json_normalize:
js = pd.read_json('path', orient='index', typ='series', convert_dates=False, convert_axes = True)
pd.json_normalize(js, record_prefix = True)
但这连接了第一个和第二个索引,所以我最终得到一个看起来像这样的 df:
A1.0.2 A2.0.8 ...
0 1.0 1.0
1 NaN NaN
我已经为 read_json 和 json_normalize 尝试了一些不同的 arg 组合,所有结果都相似。
解决方案
利用:
# STEP 1
df = pd.DataFrame(data).stack()
# STEP 2
df = df.apply(pd.Series).rename_axis(['var1', 'var2']).reset_index()
# STEP 3
df['dR'] = df.filter(like='dR').stack().reset_index(drop=True)
df['tR'] = df.filter(like='tR').stack().reset_index(drop=True)
# STEP 4
m = df.columns.str.contains(r'^dR-\d+') | df.columns.str.contains(r'^tR-\d+')
df = df.loc[:, ~m]
脚步:
# STEP 1
A1 4.0 {'dR-14': 1.181, 'ev': 1.102, 'move11': 1.259,...
A2 4.0 {'dR-03': 0.418, 'ev': -0.177, 'move11': 1.663...
A3 4.0 {'dR-16': 3.956, 'ev': 3.667, 'move11': 4.179,...
# STEP 2
var1 var2 dR-14 ev move11 move6 sILo tR-14 dR-03 tR-03 dR-16 tR-16
0 4.0 A1 1.181 1.102 1.259 1.259 1.259 1.04 NaN NaN NaN NaN
1 4.0 A2 NaN -0.177 1.663 1.663 0.418 NaN 0.418 0.818 NaN NaN
2 4.0 A3 NaN 3.667 4.179 NaN 4.246 NaN NaN NaN 3.956 3.465
# STEP 3
var1 var2 dR-14 ev move11 move6 sILo tR-14 dR-03 tR-03 dR-16 tR-16 dR tR
0 4.0 A1 1.181 1.102 1.259 1.259 1.259 1.04 NaN NaN NaN NaN 1.181 1.040
1 4.0 A2 NaN -0.177 1.663 1.663 0.418 NaN 0.418 0.818 NaN NaN 0.418 0.818
2 4.0 A3 NaN 3.667 4.179 NaN 4.246 NaN NaN NaN 3.956 3.465 3.956 3.465
# STEP 4 (RESULT)
var1 var2 ev move11 move6 sILo dR tR
0 4.0 A1 1.102 1.259 1.259 1.259 1.181 1.040
1 4.0 A2 -0.177 1.663 1.663 0.418 0.418 0.818
2 4.0 A3 3.667 4.179 NaN 4.246 3.956 3.465
推荐阅读
- c# - WebView2 控件未加载 HTML 字符串
- javascript - 如何在javascript中的数组中放置特殊字符
- python - 我应该如何处理 Pycharm 代码建议?
- python - 具有显式调用的字符串的真值和假值
- python - 检测图像上的对象边界太慢
- visual-studio-code - VSCode 文件夹不按字母顺序排序
- java - 如何使用 REST Assured 发送带有格式错误的查询参数或 URL 中的路径的请求?
- javascript - HTML表格一分为二,并排显示在同一页面上
- google-cloud-platform - fbprophet 未能在谷歌云功能中构建轮子
- javascript - 将“粘贴”功能模拟到输入文本中