python - 将 json 数据集转换为 pandas 数据框

标签 python json pandas dataframe

我有一个大型 json 数据集,其形式为:

r_json = 

[[{'gasto': 3.47},
  {'interacciones': 2.0},
  {'fecha': 'Tue, 15 Oct 2019 00:00:00 GMT'},
  {'moneda': 'USD'},
  {'id_campania': '6666070697'},
  {'id_conjunto_anuncios': '76484749901'},
  {'id_anuncio': '389396738140'},
  {'visitas_al_50': 862.6176},
  {'visitas_al_75': 651.1752},
  {'visitas_al100': 578.9394},
  {'visitas_al100': 'YouTube'},
  {'country': 'PE'},
  {'brand': 'PILSEN CALLAO'},
  {'objetivo': 'Video Views'},
  {'objetivo': 'Mon, 14 Oct 2019 00:00:00 GMT'},
  {'formato': 'Video'},
  {'nombre_campania': 'LITRAZO'},
  {'impresiones': 2106.0}],
 [{'gasto': 4.49},
  {'interacciones': 3.0},
  {'fecha': 'Fri, 15 Nov 2019 00:00:00 GMT'},
  {'moneda': 'USD'},
  {'id_campania': '213904'},
  {'id_conjunto_anuncios': '1905221'},
  {'id_anuncio': '4460317'},
  {'visitas_al_50': 791.0},
  {'visitas_al_75': 732.0}, (...)

我想将其转换为 pandas 数据框。我尝试过:

df = pd.DataFrame (r_json, columns = ['gasto', 'interacciones', 'fecha', 'moneda', 'id_campania', 
                                      'id_conjunto_anuncios', 'id_anuncio', 'visitas_al_50', 'visitas_al_75',
                                      'visitas_al100', 'visitas_al100_2', 'country', 'brand', 'objetivo', 'objetivo_2',
                                      'formato', 'nombre_campania', 'impresiones'])

但是我得到一个似乎包含字典的数据框:

    gasto   interacciones   fecha   moneda  id_campania     id_conjunto_anuncios    id_anuncio  visitas_al_50   visitas_al_75   visitas_al100   visitas_al100_2     country     brand   objetivo    objetivo_2  formato     nombre_campania     impresiones
0   {'gasto': 3.47}     {'interacciones': 2.0}  {'fecha': 'Tue, 15 Oct 2019 00:00:00 GMT'}  {'moneda': 'USD'}   {'id_campania': '6666070697'}   {'id_conjunto_anuncios': '76484749901'}     {'id_anuncio': '389396738140'}  {'visitas_al_50': 862.6176}     {'visitas_al_75': 651.1752}     {'visitas_al100': 578.9394}     {'visitas_al100': 'YouTube'}    {'country': 'PE'}   {'brand': 'PILSEN CALLAO'}  {'objetivo': 'Video Views'}     {'objetivo': 'Mon, 14 Oct 2019 00:00:00 GMT'}   {'formato': 'Video'}    {'nombre_campania': 'LITRAZO'}  {'impresiones': 2106.0}
1   {'gasto': 4.49}     {'interacciones': 3.0}  {'fecha': 'Fri, 15 Nov 2019 00:00:00 GMT'}  {'moneda': 'USD'}   {'id_campania': '213904'}   {'id_conjunto_anuncios': '1905221'}     {'id_anuncio': '4460317'}   {'visitas_al_50': 791.0}    {'visitas_al_75': 732.0}    {'visitas_al100': 699.0}    {'visitas_al100': 'Oath'}   {'country': 'PE'}   {'brand': 'PILSEN CALLAO'}  {'objetivo': 'Video Views'}     {'objetivo': 'Wed, 13 Nov 2019 00:00:00 GMT'}   {'formato': 'Video'}    {'nombre_campania': 'LITRAZO'}  {'impresiones': 832.0}

Screenshot of dataframe

我尝试了很多事情,但都没有成功。有人可以给我一些指导吗? 提前致谢。

最佳答案

在调用 DataFrame 构造函数之前,您需要稍微操作一下 JSON:

tmp = [
    dict(kv for dict_ in item for kv in dict_.items())
    for item in r_json
]
df = pd.DataFrame(tmp)

结果:

   gasto  interacciones                          fecha moneda id_campania id_conjunto_anuncios    id_anuncio  visitas_al_50  visitas_al_75 visitas_al100 country          brand                       objetivo formato nombre_campania  impresiones
0   3.47            2.0  Tue, 15 Oct 2019 00:00:00 GMT    USD  6666070697          76484749901  389396738140       862.6176       651.1752       YouTube      PE  PILSEN CALLAO  Mon, 14 Oct 2019 00:00:00 GMT   Video         LITRAZO       2106.0
1   4.49            3.0  Fri, 15 Nov 2019 00:00:00 GMT    USD      213904              1905221       4460317       791.0000       732.0000           NaN     NaN            NaN                            NaN     NaN             NaN          NaN

它是如何工作的

如果将列表的列表(即 2D 列表)传递给 DataFrame 构造函数,它假定元素以逐行的方式存储:

r_json = [
    [
        {'gasto': 3.47},        # first row, first column = {'gasto': 3.47}
        {'interacciones': 2.0}  # first row, second column = {'interacciones': 2.0}
    ],
    [
        {'gasto': 4.49},        # second row, first column = {'gasto': 4.49}
        {'interacciones': 3.0}  # second row, second column = {'interacciones': 3.0}
    ]
]
df = pd.DataFrame(r_json)

如果您传入字典列表,则它假定每个项目代表一行,每个键值对代表一列:

tmp = [
    {
        'gasto': 3.47,          # first row, column gasto = 3.47
        'interacciones': 2.0    # first row, column interacciones = 2.0
    },
    {
        'gasto': 4.49,
        'interacciones': 3.0
    }
]
df = pd.DataFrame(tmp)

所以我们需要通过合并键值对将原始JSON转换为第二种形式:

dict1 = dict([('gasto', 3.47), ('interacciones', 2.0)])
dict2 = dict([('gasto', 4.49), ('interacciones', 3.0)])
tmp = [dict1, dict2]

列表理解只是将该转换应用于整个 r_json 列表。

关于python - 将 json 数据集转换为 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72021803/

相关文章:

python - 如何调整此代码以同时返回第二个和第三个 "Nearest Neighbors"?

php - 带有 keyBy 的 Laravel 响应返回对象和数组

python - 圣人数学 : saving picture of graph to a file

Python:如何获取我所在函数的*完整*名称

javascript - 使用存储在 json 文件中的 HEX 值更改 Div 背景颜色

java - 将单词 `public` 声明为字符串变量 intellij 时出错

python - 以 html 电子邮件的形式发送 pandas dataframe 数据

python - 具有初始值的 Pandas cumsum

python - 我无法删除整个列 - Pandas

编写单行长字符串的 Pythonic 方式