首页 > 解决方案 > 将 JSON 文件转换为 Pandas 数据框

问题描述

我有一个 json 文件,我将其转换为 dict,如下所示:

{'DATA': [{'COMPANY_SCHEMA': 'ABC', 'CONFIG_TYPE': 'rtype', 'IM_ID': '44f8d1b4_437e', 'MODIFIED_DATE': 'Unknown', 'ID': 'Test', 'CONFIG_KEY': 'posting_f', 'SYSTEM_NUMBER': '50', 'SYS_CONFIG_VALUE': '0', 'SYS_CONFIG_STRING_VALUE': 'true'}

我编写了以下代码将 json 文件转换为上述 dict 格式

with open('data.json') as data_file: 
    data = json.load(data_file)

现在我正在尝试将此字典存储为 pandas 数据框,并将键作为列标题。

所以我在下面写:

df=pd.DataFrame.from_dict(data,orient='columns')

但是我将所有列都作为一列。

df.head(3)

    DATA
0   {'COMPANY_SCHEMA': 'ABC.', 'CON...
1   {'COMPANY_SCHEMA': 'ABC', 'CON...
2   {'COMPANY_SCHEMA': 'ABC', 'CON...

我基本上在一个文件夹中有一堆这样的 json 文件,我试图读取所有这些文件并将它们存储在一个 pandas 数据框中,一个附加在另一个下方。

所以我在上面尝试。所以

1)为什么在转换为熊猫数据框时出现上述错误和

ii) 有没有更好更快的方法来读取一堆这样的文件并附加到一个 json 中,然后将其添加到 pandas 框架或一个接一个?

标签: pythonpandas

解决方案


您的数据已损坏。在分析了您的问题后,我构建了一个如下所示的问题:

{'DATA': [{'COMPANY_SCHEMA': 'ABC', 'CONFIG_TYPE': 'rtype', 'IM_ID': '44f8d1b4_437e', 'MODIFIED_DATE': 'Unknown', 'ID': 'Test', 'CONFIG_KEY': 'posting_f', 'SYSTEM_NUMBER': '50', 'SYS_CONFIG_VALUE': '0', 'SYS_CONFIG_STRING_VALUE': 'true'}, {'COMPANY_SCHEMA': 'ABC', 'CONFIG_TYPE': 'rtype', 'IM_ID': '44f8d1b4_437e', 'MODIFIED_DATE': 'Unknown', 'ID': 'Test', 'CONFIG_KEY': 'posting_f', 'SYSTEM_NUMBER': '50', 'SYS_CONFIG_VALUE': '0', 'SYS_CONFIG_STRING_VALUE': 'true'}]}

由于您只提供转换后的 dict 和JSON 规范 - RFC7159声明字符串以引号开头和结尾,即". 我只是以dict为例。

我使用ast.literal_eval()从字符串中安全地获取数据结构,这dict与您的json.load(). 获取dict对象后,有多种方法可以将其转换为数据框。

import ast
import pandas as pd


with open('data.dict') as data_file:
    dict_data = ast.literal_eval(data_file.read())

# The following methods all produce the same output:
pd.DataFrame(dict_data['DATA'])
pd.DataFrame.from_dict(dict_data['DATA'])
pd.DataFrame.from_records(dict_data['DATA'])
# print(pd.DataFrame(dict_data['DATA']))
  COMPANY_SCHEMA CONFIG_TYPE          IM_ID MODIFIED_DATE    ID CONFIG_KEY SYSTEM_NUMBER SYS_CONFIG_VALUE SYS_CONFIG_STRING_VALUE
0            ABC       rtype  44f8d1b4_437e       Unknown  Test  posting_f            50                0                    true
1            ABC       rtype  44f8d1b4_437e       Unknown  Test  posting_f            50                0                    true
  1. 为什么转换为熊猫数据框时出现上述错误

如果您的意思是为什么只有一列,那就是pandas.DataFrame.from_dict()默认情况下将 dict 的键视为 DataFrame 列。如果你这样做df=pd.DataFrame.from_dict(data),谁的关键是DATA。所以只有一列名为DATA

ii) 有没有更好更快的方法来读取一堆这样的文件并附加到一个 json 中,然后将其添加到 pandas 框架或一个接一个?

我的解决方案是将所有 dict 数据连接到一个列表:

with open('data1.json') as data_file: 
    dict_data1 = json.load(data_file)

....

data = dict_data1['DATA'] + dict_data2['DATA']

# Convert to pandas dataframe
pd.DataFrame(data)

# Dump the data to json file
with open('result.json', 'w') as fp:
    json.dump({'DATA': data}, fp)

您可以使用 for 循环来简化该过程。


推荐阅读