python - 将 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 框架或一个接一个?
解决方案
您的数据已损坏。在分析了您的问题后,我构建了一个如下所示的问题:
{'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
- 为什么转换为熊猫数据框时出现上述错误
如果您的意思是为什么只有一列,那就是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 循环来简化该过程。
推荐阅读
- c# - C# Selenium:需要单击相同的按钮两次
- r - 如何在我的区域创建此特定地图
- c# - 如何从同一应用程序中的另一个表单访问 DevExpress 电子表格表单的单元格信息和控件?
- javascript - 如何检查是否已单击链接然后关闭模式
- javascript - 用Javascript替换平面数组和嵌套数组中特定键的值
- firebase - onMessage 回调函数未触发
- docker - jenkins - 更新 docker 容器并在多个阶段使用它
- amazon-web-services - 如何为 AWS CloudWatch 中的日志流指定唯一前缀过滤?
- multi-tenant - 多租户应用程序验证
- python-3.x - 如何将多个股票数据框保存到不同的单独 csv 文件中?