熊猫Dataframe到Json

问题描述 投票:1回答:1

我用熊猫制作了这行代码:

sqltable2 = sqltable.groupby(['Grupo_Resolutor', 'Sub_Estado']).size()

用这个输出

Grupo_Resolutor            Sub_Estado
ANALISIS DE CREDITO        CANCELADO                                2
                           MAL ESCALADO                            22
                           NO PROCEDE                            1120
                           NO PROCEDE RECONEXION                   41
                           SOLUCIONADO                           4446
                           SOLUCIONADO POR MASIVO               11898
COBRANZAS                  MAL ESCALADO                             2
                           NO PROCEDE                             203
                           NO PROCEDE COBRO                        39
                           NO PROCEDE POR MI PUNTO              21758
                           NO PROCEDE RECONEXION                   32
                           SOLUCIONADO                            533
                           SOLUCIONADO POR MIPUNTO              11966

我希望将该groupby对象解析为json但是当我这样做时:(我需要它带有记录,因为它用于amcharts)

sqltable2.to_json(orient = 'records')

我有这个输出:

[2,22,1120,41,4446,11898,2,203,39,21758,32,533,11966]

欲望输出:

[
  {
    "Grupo Resolutor": "Analisis de Credito",
    "CANCELADO": 2,
    "MAL ESCALADO": 22,
    "NO PROCEDE": 1120,
    "NO PROCEDE RECONEXION": 2,
    "SOLUCIONADO": 22,
    "SOLUCIONADO POR MASIVO": 1120
  },
  {
    "Grupo Resolutor": "Cobranzas",
    "MAL ESCALADO": "2",
    "NO PROCEDE": 203,
    "NO PROCEDE COBRO": 39,
    "NO PROCEDE POR MI PUNTO": 21758,
    "NO PROCEDE RECONEXION": 32,
    "SOLUCIONADO": 533,
    "SOLUCIONADO POR MIPUNTO": 11966
  }
]

等等每个'Grupo_Resolutor'(还有更多,但我不能在这个问题上放太多代码)

有任何想法吗?

python json pandas
1个回答
0
投票

首先使用DataFrame将第一级值添加到append

a = sqltable2.index.levels[0]
df = sqltable2.append(pd.Series(a, index = [a,['Grupo_Resolutor'] * len(a)]))
print (df)
Grupo_Resolutor      Sub_Estado             
ANALISIS DE CREDITO  CANCELADO                                    2
                     MAL ESCALADO                                22
                     NO PROCEDE                                1120
                     NO PROCEDE RECONEXION                       41
                     OLUCIONADO                                4446
                     SOLUCIONADO POR MASIVO                   11898
COBRANZAS            MAL ESCALADO                                 2
                     NO PROCEDE                                 203
                     NO PROCEDE COBRO                            39
                     NO PROCEDE POR MI PUNTO                  21758
                     NO PROCEDE RECONEXION                       32
                     SOLUCIONADO                                533
                     SOLUCIONADO POR MIPUNTO                  11966
ANALISIS DE CREDITO  Grupo_Resolutor            ANALISIS DE CREDITO
COBRANZAS            Grupo_Resolutor                      COBRANZAS

然后由dictionary创建list comprehension

d = [v.reset_index(level=0, drop=True).to_dict() for k,v in df.groupby(level=0)]

print (d)

[{
    'Grupo_Resolutor': 'ANALISIS DE CREDITO',
    'NO PROCEDE': 1120,
    'SOLUCIONADO POR MASIVO': 11898,
    'MAL ESCALADO': 22,
    'NO PROCEDE RECONEXION': 41,
    'OLUCIONADO': 4446,
    'CANCELADO': 2
}, {
    'NO PROCEDE COBRO': 39,
    'SOLUCIONADO POR MIPUNTO': 11966,
    'NO PROCEDE': 203,
    'SOLUCIONADO': 533,
    'NO PROCEDE POR MI PUNTO': 21758,
    'NO PROCEDE RECONEXION': 32,
    'Grupo_Resolutor': 'COBRANZAS',
    'MAL ESCALADO': 2
}]

最后写dictjson文件使用json.dump

import json

with open('result.json', 'w') as fp:
    json.dump(d, fp)

也有可能直接写入json,但获取null以获取某些列中缺少的类别的值:

j = df.unstack().to_json(orient='records')
print (j)

[{
    "CANCELADO": 2,
    "Grupo_Resolutor": "ANALISIS DE CREDITO",
    "MAL ESCALADO": 22,
    "NO PROCEDE": 1120,
    "NO PROCEDE COBRO": null,
    "NO PROCEDE POR MI PUNTO": null,
    "NO PROCEDE RECONEXION": 41,
    "OLUCIONADO": 4446,
    "SOLUCIONADO": null,
    "SOLUCIONADO POR MASIVO": 11898,
    "SOLUCIONADO POR MIPUNTO": null
}, {
    "CANCELADO": null,
    "Grupo_Resolutor": "COBRANZAS",
    "MAL ESCALADO": 2,
    "NO PROCEDE": 203,
    "NO PROCEDE COBRO": 39,
    "NO PROCEDE POR MI PUNTO": 21758,
    "NO PROCEDE RECONEXION": 32,
    "OLUCIONADO": null,
    "SOLUCIONADO": 533,
    "SOLUCIONADO POR MASIVO": null,
    "SOLUCIONADO POR MIPUNTO": 11966
}]
© www.soinside.com 2019 - 2024. All rights reserved.