记录数组到 json.dumps
Record Array to json.dumps
我需要从 Pandas DataFrame 生成 json,但是使用 df.to_json 显示分段错误,所以我想找到另一种方法来创建 json我唯一得到的就是从数据框创建一个记录数组。
现在我需要用文件名创建 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':'devin38@adventure-works.com',
'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':'devin38@adventure-works.com',
'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。
如错误所述,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
转换为包含原始 python 值的普通列表。这样它就可以被 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))
我需要从 Pandas DataFrame 生成 json,但是使用 df.to_json 显示分段错误,所以我想找到另一种方法来创建 json我唯一得到的就是从数据框创建一个记录数组。
现在我需要用文件名创建 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':'devin38@adventure-works.com',
'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':'devin38@adventure-works.com',
'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。
如错误所述,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
转换为包含原始 python 值的普通列表。这样它就可以被 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))