Создать pandas dataframe из строки - PullRequest
0 голосов
/ 24 мая 2018

Я могу легко построить кадр данных pandas из строки, содержащей только одну пару значений ключа.Например:

string1 = '{"Country":"USA","Name":"Ryan"}'
dict1 = json.loads(string1)
df=pd.DataFrame([dict1])
print(df)

Однако, когда я использую строку, содержащую более одной пары значений ключа:

string2 = '{"Country":"USA","Name":"Ryan"}{"Country":"Sweden","Name":"Sam"}{"Country":"Brazil","Name":"Ralf"}'
dict2 = json.loads(string2)

, я получаю следующую ошибку:

raise JSONDecodeError("Extra data", s, end)

Мне известно, что string2 не является допустимым JSON.

Какие изменения можно внести в string2 программно , чтобы я мог преобразовать его в действительный JSON , а затем получить вывод данных из следующего кадра:

| Country | Name |
|---------|------|
| USA     | Ryan |
| Sweden  | Sam  |
| Brazil  | Ralf |

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вероятность того, что вы получите данные из другого места в странном формате, который вы описали, после подстановок на основе регулярных выражений может исправить ваш json, и после этого вы сможете перейти согласно решению @Anton vBR.

import pandas as pd
import json
import re

string2 = '{"Country":"USA","Name":"Ryan"}{"Country":"Sweden","Name":"Sam"}{"Country":"Brazil","Name":"Ralf"}'

#create dict of substitutions 
rd = { '^{' : '[{' , #substitute starting char with [
       '}$' : '}]',  #substitute ending char with ]
       '}{' : '},{'  #Add , in between two dicts
     }

#replace as per dict
for k,v in  rd.iteritems():
    string2 = re.sub(r'{}'.format(k),r'{}'.format(v),string2)

df = pd.DataFrame(json.loads(string2))
print(df)
0 голосов
/ 24 мая 2018

Ваша ошибка

Ошибка говорит сама за себя.JSON недействителен.Где ты взял эту строку2?Вы печатаете это сами?

В этом случае вы должны заключить элементы в квадратные скобки [] и отделить элементы запятой ,.

Рабочий пример:

import pandas as pd
import json

string2 = '[{"Country":"USA","Name":"Ryan"},{"Country":"Sweden","Name":"Sam"},{"Country":"Brazil","Name":"Ralf"}]'

df = pd.DataFrame(json.loads(string2))
print(df)

Возвращает:

  Country  Name
0     USA  Ryan
1  Sweden   Sam
2  Brazil  Ralf

Интересно, что если вы слишком наблюдательны, в этой строке здесь df=pd.DataFrame([dict1]) вы фактически помещаете свой словарь в массив со скобками [].Это потому, что pandas DataFrame принимает массивы данных.То, что вы на самом деле имеете в своем первом примере, это предмет, в этом случае серия имеет больше смысла или df = pd.Series(dict1).to_frame().T.Или:

string1 = '[{"Country":"USA","Name":"Ryan"}]'  # <--- brackets here to read json as arr
dict1 = json.loads(string1)
df=pd.DataFrame(dict1)
print(df)

И если вы поняли это, я думаю, вам станет легче понять, что нам нужно , для разделения элементов.


Альтернативные входы

Но давайте представим, что вы создаете этот набор данных самостоятельно, тогда вы можете пойти дальше и сделать это:

data = [("USA","Ryan"),("Sweden","Sam"),("Brazil","Ralf")]
dict1 = [{"Country":i, "Name":y} for i,y in data] # <-- dictionaries inside arr
df = pd.DataFrame(dict1)

Или:

data = [("USA","Ryan"),("Sweden","Sam"),("Brazil","Ralf")]
df = pd.DataFrame(dict1, columns=['Country','Name'])

Или, который я предпочел бы использовать CSV-структура:

data = '''\
Country,Name
USA,Ryan
Sweden,Sam
Brazil,Ralf'''

df = pd.read_csv(pd.compat.StringIO(data))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...