json - 当键因记录而异时,使用 pandas 规范化嵌套 json
问题描述
我有一个嵌套的 json 数据集,示例如下。属性因每口井而异。当键因情况而异时,如何将这些数据标准化为数据框?我希望没有键的行显示为空。
{WellID:3。属性:[名称:xxx,值,yyy .... ....]}
样本数据:
[{'WellID': 3,
'Attributes': [{'Name': 'Production Start Date',
'Value': '5/17/2012 12:00:00 AM'},
{'Name': 'Latitude', 'Value': '36.594260510'},
{'Name': 'Longitude', 'Value': '-97.706833870'},
{'Name': 'Has Plunger', 'Value': 'True'},
{'Name': 'Has Flare', 'Value': 'True'},
{'Name': 'Has VRU', 'Value': 'True'},
{'Name': 'State', 'Value': 'OK'},
{'Name': 'Country', 'Value': 'USA'},
{'Name': 'County', 'Value': '047'},
{'Name': 'Alcohol Injector', 'Value': 'False'},
{'Name': 'Shut In', 'Value': 'False'},
{'Name': 'Active', 'Value': 'True'}]},
{'WellID': 4,
'Attributes': [{'Name': 'Production Start Date',
'Value': '5/31/2012 12:00:00 AM'},
{'Name': 'Latitude', 'Value': '36.564503337'},
{'Name': 'Longitude', 'Value': '-97.600837012'},
{'Name': 'State', 'Value': 'OK'},
{'Name': 'Country', 'Value': 'USA'},
{'Name': 'County', 'Value': '047'},
{'Name': 'Alcohol Injector', 'Value': 'False'},
{'Name': 'Shut In', 'Value': 'False'},
{'Name': 'Active', 'Value': 'True'}]},
{'WellID': 5,
'Attributes': [{'Name': 'Production Start Date',
'Value': '8/18/2012 12:00:00 AM'},
{'Name': 'Latitude', 'Value': '36.592378770'},
{'Name': 'Longitude', 'Value': '-97.725740930'},
{'Name': 'Has Plunger', 'Value': 'True'},
{'Name': 'Has Flare', 'Value': 'True'},
{'Name': 'Has VRU', 'Value': 'True'},
{'Name': 'State', 'Value': 'OK'},
{'Name': 'Country', 'Value': 'USA'},
{'Name': 'County', 'Value': '047'},
{'Name': 'Alcohol Injector', 'Value': 'False'},
{'Name': 'Shut In', 'Value': 'True'},
{'Name': 'Active', 'Value': 'True'}]},
{'WellID': 6,
'Attributes': [{'Name': 'Latitude', 'Value': '36.572665500'},
{'Name': 'Longitude', 'Value': '-97.672614600'},
{'Name': 'State', 'Value': 'OK'},
{'Name': 'Country', 'Value': 'USA'},
{'Name': 'County', 'Value': '047'},
{'Name': 'Alcohol Injector', 'Value': 'False'},
{'Name': 'Shut In', 'Value': 'False'},
{'Name': 'Active', 'Value': 'True'}]},
{'WellID': 7,
'Attributes': [{'Name': 'Latitude', 'Value': '36.562985200'},
{'Name': 'Longitude', 'Value': '-97.617945400'},
{'Name': 'State', 'Value': 'OK'},
{'Name': 'Country', 'Value': 'USA'},
{'Name': 'County', 'Value': '047'},
{'Name': 'Alcohol Injector', 'Value': 'False'},
{'Name': 'Shut In', 'Value': 'False'},
{'Name': 'Active', 'Value': 'True'}]}]
我尝试使用此语句:
result = json_normalize(subset, 'Attributes',['WellID'], errors='ignore')
但它导致以下不平坦:
Name Value WellID
0 Production Start Date 5/17/2012 12:00:00 AM 3
1 Latitude 36.594260510 3
2 Longitude -97.706833870 3
3 Has Plunger True 3
4 Has Flare True 3
5 Has VRU True 3
6 State OK 3
7 Country USA 3
8 County 047 3
9 Alcohol Injector False 3
10 Shut In False 3
11 Active True 3
12 Production Start Date 5/31/2012 12:00:00 AM 4
13 Latitude 36.564503337 4
14 Longitude -97.600837012 4
15 State OK 4
16 Country USA 4
17 County 047 4
18 Alcohol Injector False 4
19 Shut In False 4
20 Active True 4
21 Production Start Date 8/18/2012 12:00:00 AM 5
22 Latitude 36.592378770 5
23 Longitude -97.725740930 5
24 Has Plunger True 5
25 Has Flare True 5
26 Has VRU True 5
27 State OK 5
28 Country USA 5
29 County 047 5
30 Alcohol Injector False 5
31 Shut In True 5
32 Active True 5
33 Latitude 36.572665500 6
34 Longitude -97.672614600 6
35 State OK 6
36 Country USA 6
37 County 047 6
38 Alcohol Injector False 6
39 Shut In False 6
40 Active True 6
41 Latitude 36.562985200 7
42 Longitude -97.617945400 7
43 State OK 7
44 Country USA 7
45 County 047 7
46 Alcohol Injector False 7
47 Shut In False 7
48 Active True 7
请告知如何将其转换为以下格式:
井号 | 纬度 | 经度 | 状态 | .... ETC
我现在有一个数据集,该数据集在 Well ID 标签上有多个字段。有没有办法将所有这些字段都放入数据框中,而无需手动输入它们?
谢谢,
解决方案
.pivot
之后你可以试试json_normalize
。
from pandas.io.json import json_normalize
df1 = json_normalize(your_data, meta=['WellID'], record_path=['Attributes'])
df2 = df1.pivot(index='WellID', columns='Name', values='Value')
print(df2)
# Output
# Name Active Alcohol Injector Country County Has Flare Has Plunger Has VRU \
# WellID
# 3 True False USA 047 True True True
# 4 True False USA 047 None None None
# 5 True False USA 047 True True True
# 6 True False USA 047 None None None
# 7 True False USA 047 None None None
#
# Name Latitude Longitude Production Start Date Shut In State
# WellID
# 3 36.594260510 -97.706833870 5/17/2012 12:00:00 AM False OK
# 4 36.564503337 -97.600837012 5/31/2012 12:00:00 AM False OK
# 5 36.592378770 -97.725740930 8/18/2012 12:00:00 AM True OK
# 6 36.572665500 -97.672614600 None False OK
# 7 36.562985200 -97.617945400 None False OK
推荐阅读
- r - ifelse 不对数据帧执行子集
- android - 阻止应用程序部分的 Play 商店爬虫
- store - 我正在尝试将屏幕截图上传到我的应用,但我遇到了问题(应用商店连接)
- datetime - 从 Go 中从 1601-01-01 开始的时间戳计算 time.Time
- php - 在没有纯文本的mysql字段描述中搜索html文本中的单词
- php - chrome驱动程序在每次执行后清除所有会话cookie
- video - 自动播放 vimeo 在 2 个域上工作,但不是第 3 个域
- solrcloud - 使用 Solr 自动提示获取短语而不是单词
- spring-boot - springboot项目中cosmosdb的数据源配置应该是什么才能使用JdbcTemplate
- r - lattice::levelpot 使用列索引而不是名称来绘制