2016-01-27 2 views
0

Мне нужно сгенерировать json из Pandas DataFrame, но с помощью df.to_json отображается ошибка сегментации, поэтому я хочу найти другой способ создания json, и единственное, что я получил, это создать записывает массив из фрейма данных.Запись массива в json.dumps

Теперь мне нужно создать json.dumps с именами файлов. Что-то вроде этого

{ "id":123, "name":"myname"} 

Это код, который я сумел создать, и это мой файл (http://pastebin.com/iYewEfTg):

import pandas as pd 
import json 

columns = [u'SalesOrderID', u'OrderDate', u'DueDate', u'ShipDate', u'SalesOrderNumber', u'Title', u'FirstName', u'MiddleName', u'LastName', u'Suffix', u'PhoneNumber', u'PhoneNumberType', u'EmailAddress', u'EmailPromotion', u'AddressType', u'AddressLine1', u'AddressLine2', u'City', u'StateProvinceName', u'PostalCode', u'CountryRegionName', u'SubTotal', u'TaxAmt', u'Freight', u'TotalDue', u'UnitPrice', u'ProductName', u'ProductSubcategory', u'ProductCategory'] 
data = pd.read_csv('../Uploads/TxtDataSimplified.txt', header=0, names=columns, sep='\t') 
data2 = data.to_records(index=0) 
arrayJSON = [] 
for r in data2: 
    for c in columns: 
     d=[] 
     d[c] = r.__getattribute__(c) 
    arrayJSON.append(d) 

Мне нужен JSON как это:

[ 
{ 
    'City':'Sooke', 
    'FirstName':'Devin', 
    'Title':nan, 
    'LastName':'Phillips', 
    'SubTotal':'189,97', 
    'OrderDate':'2014-06-30 00:00:00.000', 
    'AddressType':'Home', 
    'PhoneNumberType':'Home', 
    'TaxAmt':'15,1976', 
    'AddressLine2':nan, 
    'AddressLine1':'2742 Cincerto Circle', 
    'DueDate':'2014-07-12 00:00:00.000', 
    'TotalDue':'209,9169', 
    'ShipDate':'2014-07-07 00:00:00.000', 
    'StateProvinceName':'British Columbia', 
    'MiddleName':nan, 
    'ProductCategory':'Accessories', 
    'PhoneNumber':'425-555-0163', 
    'CountryRegionName':'Canada', 
    'PostalCode':'V0', 
    'SalesOrderNumber':'SO75123', 
    'Suffix':nan, 
    'ProductName':'All-Purpose Bike Stand', 
    'SalesOrderID':75123, 
    'EmailAddress':'[email protected]', 
    'EmailPromotion':0, 
    'Freight':'4,7493', 
    'UnitPrice':'159', 
    'ProductSubcategory':'Bike Stands' 
}, 
{ 
    'City':'Sooke', 
    'FirstName':'Devin', 
    'Title':nan, 
    'LastName':'Phillips', 
    'SubTotal':'189,97', 
    'OrderDate':'2014-06-30 00:00:00.000', 
    'AddressType':'Home', 
    'PhoneNumberType':'Home', 
    'TaxAmt':'15,1976', 
    'AddressLine2':nan, 
    'AddressLine1':'2742 Cincerto Circle', 
    'DueDate':'2014-07-12 00:00:00.000', 
    'TotalDue':'209,9169', 
    'ShipDate':'2014-07-07 00:00:00.000', 
    'StateProvinceName':'British Columbia', 
    'MiddleName':nan, 
    'ProductCategory':'Clothing', 
    'PhoneNumber':'425-555-0163', 
    'CountryRegionName':'Canada', 
    'PostalCode':'V0', 
    'SalesOrderNumber':'SO75123', 
    'Suffix':nan, 
    'ProductName':'AWC Logo Cap', 
    'SalesOrderID':75123, 
    'EmailAddress':'[email protected]', 
    'EmailPromotion':0, 
    'Freight':'4,7493', 
    'UnitPrice':'8,99', 
    'ProductSubcategory':'Caps' 
} 
] 

И ошибка, которую я получаю, составляет:

Traceback (most recent call last):                                 
    File "/home/ubuntu/workspace/python/tests2.py", line 11, in <module>                        
    d[c] = r.__getattribute__(c)                                 
TypeError: list indices must be integers, not unicode 

Но я действительно ценю помощь с конечным результатом, я был изменением от ошибки до ошибки, но не смог добраться до того, что хочу. Мне нужен JSON, чтобы вставить его в MongoDB.

+0

Не могли бы вы предоставить образцы фрагменты как DataFrame и желаемого JSON-файл? Пожалуйста, добавьте их в свой вопрос в качестве редактирования. Откуда вы получаете исходные данные? – albert

+0

Вам также необходимо указать фактическое сообщение об ошибке, которое вы получаете. – jpmc26

ответ

0

Как и ошибка, d - это список, который вы пытаетесь индексировать с помощью строк unicode. Вы должны изменить это на словарь (d = {}).

Однако выход не был бы тем, что вы ожидаете. Вместо этого, вы можете сделать это:

for r in data2: 
    arrayJSON.append(dict(zip(columns, r.tolist()))) 

или даже это:

arrayJSON = [dict(zip(columns, r.tolist())) for r in data2] 

tolist() преобразует запись r в нормальный список, содержащий собственные значения питона. Это так, что он может быть сериализован json.dumps. json.dumps могут по-прежнему включать такие значения, как NaN, хотя это фактически не действительный JSON. Вы можете заменить эти значения в вашем DataFrame, используя: data.fillna(value="", inplace=True).

Это то, что все это будет выглядеть так:

import pandas as pd 
import json 

columns = [...] 
data = pd.read_csv('../Uploads/TxtDataSimplified.txt', header=0, names=columns, sep='\t') 
data.fillna(value="", inplace=True) 
data2 = data.to_records(index=0) 

arrayJSON = [dict(zip(columns, r.tolist())) for r in data2] 
print(json.dumps(arrayJSON)) 
+0

Отличный ответ, работающий с отличной производительностью. – Rednaxel

 Смежные вопросы

  • Нет связанных вопросов^_^