【问题标题】:Normalize nested json with pandas when keys vary by record当键因记录而异时,使用 pandas 规范化嵌套 json
【发布时间】:2018-12-07 00:28:47
【问题描述】:

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

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

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

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

谢谢,

【问题讨论】:

    标签: json pandas nested normalize


    【解决方案1】:

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

    【讨论】:

    • 在 json_normalize 函数中,如果我想抓取元级别的多个字段,我必须将它们全部输入还是有办法指定所有字段?
    • 据我所知,您必须将它们全部列出。
    【解决方案2】:

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

    以长表格式创建数据,类似于你的规范化 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
    

    给予:

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2020-06-21
      • 2021-08-02
      • 2021-04-18
      • 2021-12-12
      • 2020-09-09
      • 2018-04-09
      • 2021-07-23
      • 2021-08-09
      相关资源
      最近更新 更多