Разбор строки JSON, заключенной в кавычки из CSV, с использованием Pandas - PullRequest
0 голосов
/ 08 сентября 2018

Похоже на этот вопрос , но мой CSV имеет немного другой формат. Вот пример:

id,employee,details,createdAt  
1,John,"{"Country":"USA","Salary":5000,"Review":null}","2018-09-01"  
2,Sarah,"{"Country":"Australia", "Salary":6000,"Review":"Hardworking"}","2018-09-05"

Я думаю, что двойная кавычка в начале столбца JSON могла вызвать некоторые ошибки. Используя df = pandas.read_csv('file.csv'), это тот кадр данных, который я получил:

id  employee                details    createdAt              Unnamed: 1  Unnamed: 2 
 1      John        {Country":"USA"  Salary:5000           Review:null}"  2018-09-01 
 2     Sarah  {Country":"Australia"  Salary:6000  Review:"Hardworking"}"  2018-09-05

Мой желаемый вывод:

id  employee                                                       details   createdAt
 1      John                 {"Country":"USA","Salary":5000,"Review":null}  2018-09-01 
 2     Sarah  {"Country":"Australia","Salary":6000,"Review":"Hardworking"}  2018-09-05 

Я попытался добавить quotechar='"' в качестве параметра, и он все еще не дает мне желаемого результата. Есть ли способ заставить панд игнорировать первую и последнюю кавычку вокруг значения json?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Я думаю, что есть лучший способ передать регулярное выражение в sep=r',"|",|(?<=\d),' и, возможно, какую-то другую комбинацию параметров. Я не понял это полностью.

Вот менее оптимальный вариант:

df = pd.read_csv('s083838383.csv', sep='@#$%^', engine='python')
header = df.columns[0]
print(df)

Почему sep='@#$%^'? Это просто мусор, который позволяет читать файл без символа sep. Это может быть любой случайный символ, и он просто используется как средство для импорта данных в df объект для работы.

df выглядит так:

                       id,employee,details,createdAt
0  1,John,"{"Country":"USA","Salary":5000,"Review...
1  2,Sarah,"{"Country":"Australia", "Salary":6000...

Тогда вы можете использовать str.extract, чтобы применить регулярное выражение и расширить столбцы:

result = df[header].str.extract(r'(.+),(.+),("\{.+\}"),(.+)',
                                expand=True).applymap(str.strip)

result.columns = header.strip().split(',')
print(result)

result:

  id employee                                            details     createdAt
0  1     John    "{"Country":"USA","Salary":5000,"Review":null}"  "2018-09-01"
1  2    Sarah  "{"Country":"Australia", "Salary":6000,"Review...  "2018-09-05"

Если вам нужно, чтобы начальные и конечные кавычки были удалены из строковых значений details, вы можете сделать:

result['details'] = result['details'].str.strip('"')

Если объект details должен содержать dict s вместо строк, вы можете сделать:

from json import loads
result['details'] = result['details'].apply(loads)
0 голосов
/ 08 сентября 2018

В качестве альтернативного подхода вы можете прочитать файл вручную, правильно проанализировать каждую строку и использовать полученный data для построения кадра данных. Это работает, разбивая строку вперед и назад, чтобы получить не проблемные столбцы, а затем беря оставшуюся часть:

import pandas as pd

data = []

with open("e1.csv") as f_input:
    for row in f_input:
        row = row.strip()
        split = row.split(',', 2)
        rsplit = [cell.strip('"') for cell in split[-1].rsplit(',', 1)]
        data.append(split[0:2] + rsplit)

df = pd.DataFrame(data[1:], columns=data[0])
print(df)

Это будет отображать ваши данные как:

  id employee                                            details   createdAt
0  1     John      {"Country":"USA","Salary":5000,"Review":null}  2018-09-01
1  2    Sarah  {"Country":"Australia", "Salary":6000,"Review"...  2018-09-05
0 голосов
/ 08 сентября 2018

Я воспроизвел ваш файл С

   df = pd.read_csv('e1.csv', index_col=None )

print (df)

выход

     id    emp                                            details      createdat
0   1   john    "{"Country":"USA","Salary":5000,"Review":null}"  "2018-09-01" 
1   2  sarah  "{"Country":"Australia", "Salary":6000,"Review...   "2018-09-05"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...