2016-04-18 26 views
7

CSV verilerini alan ve pandas to_dict işlevini, verileri JSON'a dönüştürmenin son hedefine yönelik adımlardan biri olarak kullanan bir işlevle uğraştım. Sorun, sayıların modifiye edilmesidir (ör. 1.6, 1.600000000000000001 olur). Doğruluk kaybından endişe duymuyorum, fakat kullanıcılar sayılardaki değişimi göreceklerinden, amatör gibi görünüyor.Pandalar to_dict sayıları değiştiriyor

Buranın here'dan önce ortaya çıkmış bir şey olduğunun farkındayım, ama 2 yıl önceydi, gerçekten harika bir şekilde yanıtlanmadı ve ek bir komplikasyonum var - veri çerçevelerini sözlüklere dönüştürmek istiyorum veri tipleri herhangi bir kombinasyonu olabilir. önceki çözümlerle böyle bir konu olarak şunlardır:

  1. nesnelere bütün numaraları dönüştürme sadece numaraları kullanmak gerekmiyorsa çalışır - Ben eklenmesi ondalık sorunu reintroduces toplamları ve ortalamaları hesaplamak için seçenek istiyorum x ondalık sayıların
  2. Kuvvet yuvarlama doğruluğunu azaltır veya yüksek düzeyde, Yani

sağlar verilere kullanıcıyı bağlı olarak ek gereksiz tane 0 katacak ya sorum şu:

mi var en iyi yol sayıların değiştirilmediğinden emin olmak için sayısal bir veri türü içinde tutuluyor mu? CSV verilerini ilk olarak nasıl içe aktardığımı değiştirmek sorun mu? Elbette baktığım basit bir çözüm var mı?

import pandas as pd 

import sys 
if sys.version_info[0] < 3: 
    from StringIO import StringIO 
else: 
    from io import StringIO 

CSV_Data = "Index,Column_1,Column_2,Column_3,Column_4,Column_5,Column_6,Column_7,Column_8\nindex_1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\nindex_2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8\nindex_3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8\nindex_4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8" 

input_data = StringIO(CSV_Data) 
df = pd.DataFrame.from_csv(path = input_data, header = 0, sep=',', index_col=0, encoding='utf-8') 
print(df.to_dict(orient = 'records')) 
+1

Neden 'df.to_json (şark = 'kayıtları')' kullanmaz kullanan, yinelemeli JSON içine rasgele bir nesneye dönüştürür? – Zero

+0

@JohnGalt Temel olarak, sütunların dinamik yerleştirilmesine izin vermek için, to_dict kullanarak oluşturduğum sözlük, oluşturduğum daha büyük bir sözlüğe eklenir ve sonunda bir JSON'a gönderilir. –

+0

'pd.io.json.dumps (nested_dicts_with_pd_objects)' işlevini kullanabilirsiniz, bu sizin için çalışıyor mu? İdeal olarak, yuvarlama senaryosunu tanıtmamalı. – Zero

cevap

2

Sen pandalar nesnelerle iç içe dicts işlemek için pd.io.json.dumps kullanabilirsiniz: Burada

bu hata yeniden basit bir komut dosyasıdır.

Veri tabanı kayıtları ve özel metriklerle birlikte bir summary dict oluşturalım.

In [137]: summary = {'df': df.to_dict(orient = 'records'), 'df_metric': df.sum()/df.min()} 

In [138]: summary['df_metric'] 
Out[138]: 
Column_1 9.454545 
Column_2 9.000000 
Column_3 8.615385 
Column_4 8.285714 
Column_5 8.000000 
Column_6 7.750000 
Column_7 7.529412 
Column_8 7.333333 
dtype: float64 

In [139]: pd.io.json.dumps(summary) 
Out[139]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":{"Column_1":9.4545454545,"Column_2":9.0,"Column_3":8.6153846154,"Column_4":8.2857142857,"Column_5":8.0,"Column_6":7.75,"Column_7":7.5294117647,"Column_8":7.3333333333}}' 

kullanımı double_precision çiftlerde maksimum haneli hassasiyetini değiştirmek için. Not. df_metric değerleri.

In [140]: pd.io.json.dumps(summary, double_precision=2) 
Out[140]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":{"Column_1":9.45,"Column_2":9.0,"Column_3":8.62,"Column_4":8.29,"Column_5":8.0,"Column_6":7.75,"Column_7":7.53,"Column_8":7.33}}' 

Sen dataframe işlemek için orient='records/index/..' kullanabilirsiniz -> to_json inşaat. Özünde

In [144]: pd.io.json.dumps(summary, orient='records') 
Out[144]: '{"df":[{"Column_7":1.7,"Column_6":1.6,"Column_5":1.5,"Column_4":1.4,"Column_3":1.3,"Column_2":1.2,"Column_1":1.1,"Column_8":1.8},{"Column_7":2.7,"Column_6":2.6,"Column_5":2.5,"Column_4":2.4,"Column_3":2.3,"Column_2":2.2,"Column_1":2.1,"Column_8":2.8},{"Column_7":3.7,"Column_6":3.6,"Column_5":3.5,"Column_4":3.4,"Column_3":3.3,"Column_2":3.2,"Column_1":3.1,"Column_8":3.8},{"Column_7":4.7,"Column_6":4.6,"Column_5":4.5,"Column_4":4.4,"Column_3":4.3,"Column_2":4.2,"Column_1":4.1,"Column_8":4.8}],"df_metric":[9.4545454545,9.0,8.6153846154,8.2857142857,8.0,7.75,7.5294117647,7.3333333333]}' 

, pd.io.json.dumps - uç objektif json kullanmak ise içten, ultrajson