Нормализуйте вложенный json с пандами, когда ключи меняются в зависимости от записи - PullRequest
0 голосов
/ 28 июня 2018

У меня есть вложенный набор данных JSON, пример ниже. Где атрибуты варьируются в зависимости от каждой скважины. Как я могу нормализовать эти данные в кадре данных, когда ключи меняются от случая к случаю? Я хотел бы строки, которые не имеют ключей, чтобы появиться как ноль.

{WellID: 3. Атрибуты: [ Имя: ххх, Значение, гггг .... ....]}

Пример данных:

[{'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 | Широта | Долгота | Государство | .... и т. д.

Теперь у меня есть набор данных с несколькими полями на метке идентификатора скважины. Есть ли способ поместить все эти поля в фрейм данных, не вводя их вручную?

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете попробовать .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
0 голосов
/ 28 июня 2018

Вы просто хотели изменить свой результирующий фрейм данных? Если так, то вот минимальный пример того, как это сделать.

Создайте данные в формате длинной таблицы, аналогично вашему нормализованному json:

import pandas as pd

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

data

Вот наши данные:

enter image description here

Затем, чтобы повернуть, используйте:

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

pivoted

Дает:

enter image description here

...