pandas 如何管理这个嵌套字典,使其在 Dataframe 中更易于阅读

nbnkbykc  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(136)

我目前在一个项目中工作,我必须从表格中提取数据的网页。我的目标是保存这些信息,并应用一些转换来以我的老板可以理解的方式表示这些数据。
我可以提取信息并将其保存在嵌套字典**(1)**中,如下所示

dicionario = 
{

'38609-2023':
            [
                {'Folio': '6', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '20/03/2023', 'Fecha Trámite': 'Resolución', 'Trámite': 'DESE CUENTA', 'Des. Trámite': '210337-2023', 'Correlativo': 'Cuenta (Secretaria)', 'Salas': 'Bloqueado'},

              {'Folio': '5', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 195 C.O.T', 'Des. Trámite': '209274-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'},

             {'Folio': '4', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 196 C.O.T', 'Des. Trámite': '209273-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'},

             {'Folio': '2', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERTIFICADO DE INGRESO', 'Des. Trámite': '209272-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}
            ],
              
'38451-2023': 
            [
                  {'Folio': '5', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '20/03/2023', 'Fecha Trámite': 'Resolución', 'Trámite': 'DESE CUENTA', 'Des. Trámite': '210447-2023', 'Correlativo': 'Cuenta (Secretaria)', 'Salas': 'Bloqueado'},

                  {'Folio': '4', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 195 C.O.T', 'Des. Trámite': '208820-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'},

                  {'Folio': '2', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERTIFICADO DE INGRESO', 'Des. Trámite': '208819-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}
            ]}

因此,我想添加一个新的内部键,使用日期键值**'Año'('Año':'20/03/2023','Año':“17/03/2023”等)。
为了完成这一点,我在第一个字典
(1)**中使用以下代码行:

new_dict={}
for keys, values in dicionario.items():
    if not keys in new_dict:
        new_dict[keys]={}
    for value in values:
        print(value['Año'], value, keys)
        try:
            new_dict[keys][value['Año']]
        except KeyError:
            new_dict[keys][value['Año']] = []
        new_dict[keys][value['Año']].append(value)

print(new_dict)

结果会是:

{
'38609-2023': 
               {
                  '20/03/2023': [
                                    {'Folio': '6', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '20/03/2023', 'Fecha Trámite': 'Resolución', 'Trámite': 'DESE CUENTA', 'Des. Trámite': '210337-2023', 'Correlativo': 'Cuenta (Secretaria)', 'Salas': 'Bloqueado'
                                    }
                                ], 

                  '17/03/2023': [
                                    {'Folio': '5', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 195 C.O.T', 'Des. Trámite': '209274-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}, 
                                    {'Folio': '4', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 196 C.O.T', 'Des. Trámite': '209273-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}, 
                                    {'Folio': '2', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERTIFICADO DE INGRESO', 'Des. Trámite': '209272-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}
                                ]
               }, 

'38451-2023': 
                {
                   '20/03/2023': [
                                    {'Folio': '5', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '20/03/2023', 'Fecha Trámite': 'Resolución', 'Trámite': 'DESE CUENTA', 'Des. Trámite': '210447-2023', 'Correlativo': 'Cuenta (Secretaria)', 'Salas': 'Bloqueado'}

                                 ], 
                   
                   '17/03/2023': [
                                    {'Folio': '4', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERT. INHABILIDAD ART. 195 C.O.T', 'Des. Trámite': '208820-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}, 
                                    {'Folio': '2', 'Doc.': 'Descargar Documento', 'Anexo': '2023', 'Año': '17/03/2023', 'Fecha Trámite': 'Otro Tramite', 'Trámite': 'CERTIFICADO DE INGRESO', 'Des. Trámite': '208819-2023', 'Correlativo': 'Unidad Ingreso', 'Salas': 'Bloqueado'}]}}

在此之后,我想扁平化嵌套的字典,使其更具可读性

df = pd.DataFrame.from_dict(new_dict, orient="index").stack().to_frame()
final_df = pd.DataFrame(df[0].values.tolist(), index=df.index)
print(final_df)

结果就是这样一个 Dataframe

这一点都不坏。。。但是我想使用行中的键来将其用作列,并使用值来填充每一个新列

第0列替换为:Folio Doc. Anexo Año Fecha Trmite Trmite Des. Trmite Correlativo Salas Estado
第1列替换为:Folio Doc. Anexo Año Fecha Trmite Trmite Des. Trmite Correlativo Salas Estado
第2列替换为:Folio Doc. Anexo Año Fecha Trmite Trmite Des. Trmite Correlativo Salas Estado

我试着用一个小例子更好地解释

我试过使用pd.Dataframe.from_dict,你可以在帖子中看到,但它不起作用。我也试过将嵌套字典转换为json,然后使用pd.json_normalize,但我不能得到我想要的。也使用
有什么想法我可以做什么?…也许在所有列中做一个lambda函数?我真的不知道…我没有太多的expirencie。请帮助我

ttisahbt

ttisahbt1#

您可以将数据直接加载到pandas中:

df = pd.DataFrame(dicionario.items(), columns=["id", "data"]).explode("data")
>>> df
           id                                               data
0  38609-2023  {'Folio': '6', 'Doc.': 'Descargar Documento', ...
0  38609-2023  {'Folio': '5', 'Doc.': 'Descargar Documento', ...
0  38609-2023  {'Folio': '4', 'Doc.': 'Descargar Documento', ...
0  38609-2023  {'Folio': '2', 'Doc.': 'Descargar Documento', ...
1  38451-2023  {'Folio': '5', 'Doc.': 'Descargar Documento', ...
1  38451-2023  {'Folio': '4', 'Doc.': 'Descargar Documento', ...
1  38451-2023  {'Folio': '2', 'Doc.': 'Descargar Documento', ...

它的名字中有“json”,但.json_normalize可以在这里解包嵌套的数据:

>>> pd.json_normalize(df["data"])
  Folio                 Doc. Anexo         Año Fecha Trámite                           Trámite Des. Trámite          Correlativo      Salas
0     6  Descargar Documento  2023  20/03/2023    Resolución                       DESE CUENTA  210337-2023  Cuenta (Secretaria)  Bloqueado
1     5  Descargar Documento  2023  17/03/2023  Otro Tramite  CERT. INHABILIDAD ART. 195 C.O.T  209274-2023       Unidad Ingreso  Bloqueado
2     4  Descargar Documento  2023  17/03/2023  Otro Tramite  CERT. INHABILIDAD ART. 196 C.O.T  209273-2023       Unidad Ingreso  Bloqueado
3     2  Descargar Documento  2023  17/03/2023  Otro Tramite            CERTIFICADO DE INGRESO  209272-2023       Unidad Ingreso  Bloqueado
4     5  Descargar Documento  2023  20/03/2023    Resolución                       DESE CUENTA  210447-2023  Cuenta (Secretaria)  Bloqueado
5     4  Descargar Documento  2023  17/03/2023  Otro Tramite  CERT. INHABILIDAD ART. 195 C.O.T  208820-2023       Unidad Ingreso  Bloqueado
6     2  Descargar Documento  2023  17/03/2023  Otro Tramite            CERTIFICADO DE INGRESO  208819-2023       Unidad Ingreso  Bloqueado

我们可以复制原始index + id列并将其添加到结果中:
一个三个三个一个
然后可以将id/ano设置为索引:

>>> df.set_index(["id", "Año"])
                      Folio                 Doc. Anexo Fecha Trámite                           Trámite Des. Trámite          Correlativo      Salas
id         Año                                                                                                                                     
38609-2023 20/03/2023     6  Descargar Documento  2023    Resolución                       DESE CUENTA  210337-2023  Cuenta (Secretaria)  Bloqueado
           17/03/2023     5  Descargar Documento  2023  Otro Tramite  CERT. INHABILIDAD ART. 195 C.O.T  209274-2023       Unidad Ingreso  Bloqueado
           17/03/2023     4  Descargar Documento  2023  Otro Tramite  CERT. INHABILIDAD ART. 196 C.O.T  209273-2023       Unidad Ingreso  Bloqueado
           17/03/2023     2  Descargar Documento  2023  Otro Tramite            CERTIFICADO DE INGRESO  209272-2023       Unidad Ingreso  Bloqueado
38451-2023 20/03/2023     5  Descargar Documento  2023    Resolución                       DESE CUENTA  210447-2023  Cuenta (Secretaria)  Bloqueado
           17/03/2023     4  Descargar Documento  2023  Otro Tramite  CERT. INHABILIDAD ART. 195 C.O.T  208820-2023       Unidad Ingreso  Bloqueado
           17/03/2023     2  Descargar Documento  2023  Otro Tramite            CERTIFICADO DE INGRESO  208819-2023       Unidad Ingreso  Bloqueado
rvpgvaaj

rvpgvaaj2#

我想这可以解决你的问题。
您的问题与下面的主题非常相似。链接:Nested dictionary to multiindex dataframe where dictionary keys are column labels
只需在新的dict中对上述主题中的函数进行一点修改,并将其转换为 Dataframe 。
示例代码:

AdjustedDict = {(outerKey, innerKey): values[0] for outerKey, innerDict in new_dict.items() for innerKey, values in innerDict.items()}

visualizationDf = pd.DataFrame(AdjustedDict).T

print(visualizationDf)

编辑:

我注意到这比上面的解决方案稍微复杂一点,因为你有一个字典,它的项目是字典的列表。
然后,您需要打开该结构以创建数据框。
下面的循环解决了这个问题,但我需要创建一个新的索引k

k=0
for outerKey, innerDict in new_dict.items():
    for innerKey, values in innerDict.items():
        if len(values) ==1:
            auxDict[(k,outerKey,innerKey)] = values[0]
        else: 
            
            for i in values:
                auxDict[(k,outerKey,innerKey)] = i
                k= k+1
        k=k+1
                

print(pd.DataFrame(auxDict).T)

相关问题