当键因记录而异时,将嵌套 json 规范化为 pandas

Normalize nested json with pandas when keys vary by record

我有一个嵌套的 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

请告知如何将其转换成以下格式:

井号 |纬度 |经度 |状态 | ....等等

我现在有一个数据集,在 Well ID 标签上有多个字段。有没有一种方法可以将所有这些字段放入数据框中而无需手动将它们全部输入?

谢谢,

您只是想旋转结果数据框吗?如果是这样,这里是如何做到这一点的最小示例。

以长 table 格式创建数据,类似于您的规范化 json:

import pandas as pd

data = pd.DataFrame({'name': ['lat', 'long', 'country', 'active', 'state'], 'value': [90, 90, 'US', True, 'OH'], 'id': 2})

data

这是我们的数据:

然后旋转,使用:

pivoted = data.pivot(index = 'id', columns = 'name')

pivoted

给出:

您可以在 json_normalize 之后尝试 .pivot

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