如何将带有 JSON 字符串的 Pandas DataFrame 转换为有效的 JSON?

Posted

技术标签:

【中文标题】如何将带有 JSON 字符串的 Pandas DataFrame 转换为有效的 JSON?【英文标题】:How to convert Pandas DataFrame with JSON-strings into valid JSON? 【发布时间】:2020-10-26 22:03:22 【问题描述】:

我正在尝试将带有多个表格的 lage excel 文件保存到带有熊猫的 JSON 文件中。我需要这样的结果结构:

 'Sheet1':
   [ 'column1': value,
     'column2': value,
     'column3': value,
     'column4': value ]
'Sheet2':
   [ 'column1': value,
     'column2': value,
     'column3': value,
     'column4': 'json_key1': value,
                 'json_key2': value,
   ]
 

我试过这个代码来得到这个:

import pandas as pd
import json

EXCEL_FILE = 'example_data.xlsm'
JSON_FILE = 'json_data.json'

sheets = pd.ExcelFile(EXCEL_FILE).sheet_names
json_data = 
for sheet in sheets:
    df = pd.read_excel(EXCEL_FILE, index_col=None, header=0, sheet_name=sheet, na_values='null')
    json_data[sheet] = json.loads(df.to_json(orient='records', force_ascii=False, date_format='iso'))
with open(JSON_FILE, 'w',  encoding='utf-8') as json_file:
    json.dump(json_data, json_file, indent=2, ensure_ascii=False)

excel 中有几列带有类似 json 的字符串。 [1]:https://i.stack.imgur.com/gvc0K.png

当我使用 df.to_json() 导出到 JSON 时,它会像这样保存这些列:


  "acts_31L": [
    
      "ID": 219100060,
      "ID_ETD": null,
      "INDEX_NUM": "31-7635-191022195410",
      "IT_SECTIONS": "\"CTIME\":\"2019-10-22 21:26:41.680\",\"section\":\"CTIME\":\"2019-10-22 21:26:41.680\",\"SERIE\":\"506\",\"SERIE_NAME\":\"ТЭП70\",\"SER_NUM\":\"00000542\",\"SEC_CODE\":\"0\",\"EL_COUNT\":0,\"FUEL_LIT\":0.0,\"FUEL_DENS\":0.8,\"FUEL_KG\":0.0,\"IS_NEED\":\"1\"",
      "IT_INVENT": "\"CTIME\":\"2019-10-22 21:26:41.680\",\"inv\":\"CTIME\":\"2019-10-22 21:26:41.680\",\"INVENT_NAME\":\"Пенька\",\"UNIT\":\"шт.\",\"NORMA\":0,\"FACT\":0,\"INFO_TYPE\":\"0\""
    ,

那么如何将这些字符串保存为 json-object 呢?

【问题讨论】:

【参考方案1】:

在将数据帧转换为 json 之前,使用 ast.literal_eval 将列 IT_SECTIONSIT_INVENT 转换为 dict。然后就可以转成json了。

from ast import literal_eval

for sheet in sheets:
    df = pd.read_excel(EXCEL_FILE, index_col=None, header=0, sheet_name=sheet, na_values='null')
    df['IT_SECTIONS'] = df['IT_SECTIONS'].apply(lambda x: literal_eval(str(x)))
    df['IT_INVENT'] = df['IT_INVENT'].apply(lambda x: literal_eval(str(x)))
    json_data[sheet] = json.loads(df.to_json(orient='records', force_ascii=False, date_format='iso'))

【讨论】:

以上是关于如何将带有 JSON 字符串的 Pandas DataFrame 转换为有效的 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NULL 视为带有 pandas 的普通字符串?

从 pandas DataFrame 中的列中提取 JSON 数据

将带有嵌套字典的json响应转换为pandas数据框[重复]

如何将 pandas DataFrame 行保存为 JSON 字符串?

将 pandas 数据帧转换为 json 对象 - pandas

如何将 Pandas 数据框/系列数据保存为图形?