Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据框中包含分号数据的字典_Python_Pandas - Fatal编程技术网

Python 数据框中包含分号数据的字典

Python 数据框中包含分号数据的字典,python,pandas,Python,Pandas,我从web上收集了一些数据,我想把这些数据放到一个数据框中 刮取的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":&quo

我从web上收集了一些数据,我想把这些数据放到一个数据框中

刮取的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"}} 
(...)
我想实现一个熊猫数据帧,其信息类似于:

 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
直到现在,我只能通过将数据保存在文件中并使用文本编辑器执行疯狂的操作来实现这一点

我可以通过编程做些什么来实现相同的结果?
我唯一感兴趣的数据是与用分号划分的大键相关的数据;(值本身也是分号分隔的)

将列表定义为多行字符串,将
u\ufffd
替换为
,加载为
JSON
, 循环键和值,有条件地保存到列表,最后使用这些列表创建数据帧:

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

将列表定义为多行字符串,将
u\ufffd
替换为
,加载为
JSON
, 循环键和值,有条件地保存到列表,最后使用这些列表创建数据帧:

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

感谢古斯塔夫·拉斯穆森,他给了我解决这个问题的方法

他的回答有一些我不知道的重要见解(比如使用模块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

感谢古斯塔夫·拉斯穆森,他给了我解决这个问题的方法

他的回答有一些我不知道的重要见解(比如使用模块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

我看不到JSONScraped中的值
50613
,意思是扔掉。您的意思是scrapedI没有看到JSONScraped means中的值
50613
。你是说非常感谢你的帮助古斯塔夫,不幸的是我仍然有麻烦。我得到了一个超出范围的错误,可能是因为我废弃的数据在一个列表对象(下面的j2)中,我无法使用“”将其转换为多行字符串。我尝试使用缩进进行修饰,但仍然得到相同的错误col.append(key.split(“;”)[k])indexer:list index超出范围我尝试的是:j2=j['features']j2Str=json.dumps(j2)val=j2Str.replace(r“u\ufffd”,“?”).replace(r“\ufffd”,“?”)val=json.dumps(json.loads(val),indent=4)j=json.loads(val)非常感谢你的帮助,不幸的是,我仍然有麻烦。我收到一个超出范围的错误,可能是因为我废弃的数据在一个列表对象中(下面的j2)我无法使用“”将其转换为多行字符串我尝试使用缩进进行修饰,但仍然得到相同的错误col.append(key.split(“;”)[k])indexer:list index超出范围我尝试过的:j2=j['features']j2Str=json.dumps(j2)val=j2Str.replace(r“u\ufffd”,“?”).replace(r“\ufffd”,“?”)val=json.dumps(json.loads(val),indent=4)j=json.loads(val)