синтаксический анализ файла JSON с тремя типами форматированных данных в трех отдельных фреймах данных - PullRequest
0 голосов
/ 18 мая 2019

У меня есть данные JSON, которые содержат три разных типа записей, которые мне нужно прочитать, проанализировать для каждого типа и сохранить как три отдельных фрейма данных.Я использовал фиктивные данные здесь, так как фактические записи довольно длинные.Данные имеют различное количество столбцов для каждого типа записи с некоторыми общими именами столбцов.Схемы в основном:

схема 1: одна запись на ИД элемента с базовыми характеристиками в широком формате, которая выглядит следующим образом:

[id,year,object_name,base_price]

схема 2 и 3: каждая представляет собой набор различных функцийв длинном формате для одного идентификатора, который выглядит следующим образом:

[id, feature1, price1]

[id, feature2, price2]

[id, feature1, size1]

[id, feature2, size2]

Вот как выглядят данные JSON

[

{"id": ["500068"], "year": ["2018"], "object_name": "barn"},

{"id": ["500069"], "year": ["2018"], "object_name": "well"},

{"id": ["500068"], "year": ["2018"], "feature": "extension","price": "65"},

{"id": ["500068"], "year": ["2018"], "feature": "stalls","price": "72"},

{"id": ["500070"], "year": ["2018"], "feature": "depth_extension","price": "55"},

{"id": ["500070"], "year": ["2018"], "feature": "cover","price": "55"},

{"id": ["500070"], "year": ["2018"], "feature": "depth_extension","size": "1050"},

{"id": ["500070"], "year": ["2018"], "feature": "cover","size": "1160"},

]

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

import pandas as pd

with open(file, 'r') as f:
    data = f.readlines()

# remove the trailing "\n" from each line
data = map(lambda x: x.rstrip(), data)

# each element of 'data' is an individual JSON object.
# i want to convert it into an *array* of JSON objects
# which, in and of itself, is one large JSON object
# basically... add square brackets to the beginning
# and end, and have all the individual business JSON objects
# separated by a comma
data_json_str = "[" + ','.join(data) + "]"

# now, load it into pandas 
# (I get stuck here since they are different record types
data_df = pd.read_json(data_json_str)

Я бы хотел, чтобы данные считывались в три разных фрейма данных панд с соответствующими именами столбцов.Спасибо за помощь!

1 Ответ

0 голосов
/ 18 мая 2019

Чтобы создать 3 разных фрейма данных из разных типов имен столбцов данных json, вы можете попробовать следующий код.

import pandas as pd

json_data='[{"id": ["500068"], "year": ["2018"], "object_name": "barn"},{"id": ["500069"], "year": ["2018"], "object_name": "well"},{"id": ["500068"], "year": ["2018"], "feature": "extension","price": "65"},{"id": ["500068"], "year": ["2018"], "feature": "stalls","price": "72"},{"id": ["500070"], "year": ["2018"], "feature": "depth_extension","price": "55"},{"id": ["500070"], "year": ["2018"], "feature": "cover","price": "55"},{"id": ["500070"], "year": ["2018"], "feature": "depth_extension","size": "1050"},{"id": ["500070"], "year": ["2018"], "feature": "cover","size": "1160"},]'
list_data=eval(json_data)

df=pd.DataFrame(list_data)

df1=df[df['size'].notnull()]
df1=df1.drop(['object_name','price'], 1)
print(df1)
print('\n')

df2=df[df['price'].notnull()]
df2=df2.drop(['object_name','size'], 1)
print(df2)
print('\n')

df3=df[df['object_name'].notnull()]
df3=df3.drop(['feature', 'price', 'size'], 1)
print(df3)
print('\n')

Выход:

           feature        id  size    year
6  depth_extension  [500070]  1050  [2018]
7            cover  [500070]  1160  [2018]


           feature        id price    year
2        extension  [500068]    65  [2018]
3           stalls  [500068]    72  [2018]
4  depth_extension  [500070]    55  [2018]
5            cover  [500070]    55  [2018]


         id object_name    year
0  [500068]        barn  [2018]
1  [500069]        well  [2018]

Надеюсь, это поможет вам, хорошего дня. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...