Очистить теги от JSON перед записью в Excel - PullRequest
0 голосов
/ 28 марта 2019

Я получаю набор данных json из внешнего источника, поэтому не могу повлиять на формат. Значения данных форматируются в квадратных скобках и двойных кавычках. Например, [{"casenumber": ["12345678"], "problemcode": ["ABC123"], "TITLE": ["Ты что, шутишь?"]}]

Я могу прочитать / проанализировать это в DataFrame, но когда я пытаюсь записать DataFrame в Excel, все данные помечаются квадратными скобками и одинарными кавычками. Есть ли способ удалить все теги, чтобы мне не нужно было вручную очищать данные Excel?

Я пробовал несколько вариантов пост-обработки данных после чтения их из JSON, но не могу заставить их работать

import json, 
def getJSONData(file):
    returnFrame = pd.DataFrame()
    with open(file, 'r', encoding="utf8") as jsonfile:
                json_data=jsonfile.read()
                loaded_json = json.loads(json_data)

                returnFrame=returnFrame.append(loaded_json)
    #strip out tags
    for label, content in returnFrame.iteritems():
                    returnFrame[label]=content.replace("[","")
    return returnFrame
.
.
.
caseDataFrame=getJSONData(JSONFolderFileName)
caseDataFrame.to_excel('CaseData'+str(time.time())+'.xlsx')

В Excel данные выглядят так (представьте, что «|» - это граница ячейки):

регистрационный номер | код проблемы | TITLE

['12345678'] | ['ABC123'] | [«Ты что, шутишь?»]

и я бы предпочел, чтобы это выглядело так:

регистрационный номер | код проблемы | TITLE

12345678 | ABC123 | Ты что, шутишь?

1 Ответ

0 голосов
/ 28 марта 2019

Если все в том же формате, это должно работать:

data =  [{ "casenumber":["12345678"],"problemcode":["ABC123"],"TITLE":["Are You Kidding Me?"] }]


import pandas as pd

def flatten_json(y):
    out = {}
    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x
    flatten(y)
    return out



flat = flatten_json(data)

results = pd.DataFrame()
columns_list = list(flat.keys())
for item in columns_list:
    row_idx = item.split('_')[0]
    column = item.split('_')[1]

    row_idx = int(row_idx)
    value = flat[item]
    results.loc[row_idx, column] = value

results.to_excel('path/file.xls', index = False)

Выход:

print (results)
  casenumber problemcode                TITLE
0   12345678      ABC123  Are You Kidding Me?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...