Словарь с данными точки с запятой до Pandas Dataframe - PullRequest
1 голос
/ 12 июля 2020

У меня есть данные, удаленные из Интернета, которые я хочу поместить в pandas фрейм данных

уничтоженные json данные находятся в следующем формате:

[{"attributes":{"OBJECTID":0,"dt_notific;dt_inicio_sintomas;bairro_resid__estadia;ap_residencia_estadia;evolu\ufffd\ufffdo;dt_\ufffdbito;CEP;Data_atualiza\ufffd\ufffdo":"06/05/2020;06/05/2020;CACHAMBI;3.2;\ufffdbito;07/05/2020;20771330;11/07/2020"}},{"attributes":{"OBJECTID":1,"dt_notific;dt_inicio_sintomas;bairro_resid__estadia;ap_residencia_estadia;evolu\ufffd\ufffdo;dt_\ufffdbito;CEP;Data_atualiza\ufffd\ufffdo":"06/05/2020;05/05/2020;TIJUCA;2.2;\ufffdbito;12/05/2020;20261120;11/07/2020"}},{"attributes":{"OBJECTID":2,"dt_notific;dt_inicio_sintomas;bairro_resid__estadia;ap_residencia_estadia;evolu\ufffd\ufffdo;dt_\ufffdbito;CEP;Data_atualiza\ufffd\ufffdo":"25/04/2020;25/04/2020;JACAREPAGUA;4.0;\ufffdbito;25/04/2020;22753211;11/07/2020"}} 
(...)

чтобы получить pandas фрейм данных с информацией, подобной этой:

 0   dt_notific             50613 non-null  object 
 1   dt_inicio_sintomas     50603 non-null  object 
 2   bairro_resid__estadia  50640 non-null  object 
 3   ap_residencia_estadia  50640 non-null  float64
 4   evolucao               50640 non-null  object 
 5   dt_obito               4727 non-null   object 
 6   CEP                    50640 non-null  int64  
 7   dt_registro            50640 non-null  object

До сих пор я могу добиться этого только путем сохранения данных в файле и выполнения сумасшедших вещей с помощью текстового редактора.

Что я могу сделать программно для достижения того же результата? Единственные интересные для меня данные - это данные, связанные с большим ключом, разделенным точкой с запятой; (само значение также разделяется точкой с запятой)

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Спасибо Густаву Расмуссену, который дал мне способ справиться с этой проблемой.

Его ответ содержал некоторые важные идеи, которых я не знал (поскольку тот, кто использовал модуль 2 «% 2», чтобы получить только поле, которое мне было нужно, и отбросить поле OBJECTID)

Я внес некоторые изменения в его код, и теперь все работает так, как я ожидал. Окончательный код был

    j2Str = json.dumps(j2)
    val = j2Str.replace(r"u\ufffd", "?").replace(r"\ufffd", "?")
    j = json.loads(val)

    i = 0
    listoflists = []
    a_list = []
    for line in j:
        for v in line.values():
            for key, value in v.items():
                # print(key, value)
                if i % 2 == 0:
                    a_list = value.split(';')
                    listoflists.append(a_list[:])
                i += 1

    df = pandas.DataFrame(numpy.array(listoflists),
                       columns=["dt_notific","dt_inicio_sintomas","bairro_resid__estadia","ap_residencia_estadia","evolcao","dt_obito","CEP","Data_atualizacao"])

    print(df.info())

И полученная информация о фрейме данных:

 0   dt_notific             2000 non-null   object
 1   dt_inicio_sintomas     2000 non-null   object
 2   bairro_resid__estadia  2000 non-null   object
 3   ap_residencia_estadia  2000 non-null   object
 4   evolcao                2000 non-null   object
 5   dt_obito               2000 non-null   object
 6   CEP                    2000 non-null   object
 7   Data_atualizacao       2000 non-null   object
0 голосов
/ 12 июля 2020

Определите список как многострочную строку, замените u\ufffd на ?, загрузите как JSON, l oop по ключам и значениям, условно сохраняя в списках, и, наконец, используйте эти списки для создания Pandas DataFrame:

import json
import pandas as pd

val = r"""
[
    {
        "attributes": {
            "OBJECTID": 0,
            "dt_notific;dt_inicio_sintomas;bairro_resid__estadia;ap_residencia_estadia;evolu\ufffd\ufffdo;dt_\ufffdbito;CEP;Data_atualiza\ufffd\ufffdo":
            "06/05/2020;06/05/2020;CACHAMBI;3.2;\ufffdbito;07/05/2020;20771330;11/07/2020"
        }
    },
    {
        "attributes": {
            "OBJECTID": 1,
            "dt_notific;dt_inicio_sintomas;bairro_resid__estadia;ap_residencia_estadia;evolu\ufffd\ufffdo;dt_\ufffdbito;CEP;Data_atualiza\ufffd\ufffdo":
            "06/05/2020;05/05/2020;TIJUCA;2.2;\ufffdbito;12/05/2020;20261120;11/07/2020"
        }
    },
    {
        "attributes": {
            "OBJECTID": 2,
            "dt_notific;dt_inicio_sintomas;bairro_resid__estadia;ap_residencia_estadia;evolu\ufffd\ufffdo;dt_\ufffdbito;CEP;Data_atualiza\ufffd\ufffdo":
            "25/04/2020;25/04/2020;JACAREPAGUA;4.0;\ufffdbito;25/04/2020;22753211;11/07/2020"
        }
    }
]
""".replace(r"u\ufffd", "?").replace(r"\ufffd", "?")

j = json.loads(val)

i = 0
k = 0
index = []
col = []
for line in j:
    for v in line.values():
        for key, value in v.items():
            # print(key, value)
            if i % 2 == 0:
                index.append(value)
            else:
                col.append(key.split(';')[k])
                k += 1
            i += 1

df = pd.DataFrame(col,
                  index=index
                  )
print(df)

Возвращает:

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