当键因记录而异时,使用熊猫规范化嵌套json

当键因记录而异时,使用熊猫规范化嵌套json,json,pandas,nested,normalize,Json,Pandas,Nested,Normalize,我有一个嵌套的json数据集,示例如下。每口井的属性各不相同。当密钥在不同情况下发生变化时,如何将该数据规范化为数据帧?我希望没有键的行显示为空 {韦利德:3。 属性:[ 名称:xxx,值,yyy .... ..]} 样本数据: [{'WellID': 3, 'Attributes': [{'Name': 'Production Start Date', 'Value': '5/17/2012 12:00:00 AM'}, {'Name': 'Latitude', 'Value

我有一个嵌套的json数据集,示例如下。每口井的属性各不相同。当密钥在不同情况下发生变化时,如何将该数据规范化为数据帧?我希望没有键的行显示为空

{韦利德: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
请告知如何将其转换为以下格式:

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

我现在有一个数据集,在井ID标签上有多个字段。有没有一种方法可以将所有这些字段都输入到数据框中,而不必手动全部输入


谢谢,

您是否只想将结果数据帧作为轴心点?如果是这样,这里有一个如何做到这一点的最低限度的例子

以长表格式创建数据,类似于标准化的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:

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\u规范化之后尝试
.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

您可以在
json\u 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

在json_normalize函数中,如果我在元级别上有多个字段要抓取,我是否必须全部键入,或者是否有方法指定所有字段?正如我所知,您必须列出所有字段。在json_normalize函数中,如果我在元级别上有多个字段要抓取,我必须把它们全部打印出来,还是有办法把它们全部指定出来?我知道,你必须把它们全部列出。