首页 > 解决方案 > 当键因记录而异时,使用 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 标签上有多个字段。有没有办法将所有这些字段都放入数据框中,而无需手动输入它们?

谢谢,

标签: jsonpandasnestednormalize

解决方案


.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

推荐阅读