2016-04-18 11 views
7

मैं एक ऐसे फ़ंक्शन के साथ खेल रहा हूं जो सीएसवी डेटा का सेवन करता है और डेटा को जेएसओएन में परिवर्तित करने के अंतिम लक्ष्य की दिशा में चरणों में से एक के रूप में कार्य करने के लिए पांडा का उपयोग करता है। समस्या यह है कि यह संख्याओं को संशोधित कर रहा है (उदाहरण के लिए 1.6 1.6000000000000001 बन जाता है)। मैं सटीकता के नुकसान के बारे में चिंतित नहीं हूं, लेकिन क्योंकि उपयोगकर्ता संख्याओं में परिवर्तन देखेंगे, ऐसा लगता है ... शौकिया।पांडस संख्याओं को संशोधित करने के लिए

मुझे पता है कि यह कुछ ऐसा है जो here से पहले आया है, लेकिन यह 2 साल पहले वास्तव में एक महान तरीके से उत्तर नहीं दिया गया था, और मेरे पास एक अतिरिक्त जटिलता है - डेटा फ्रेम जिन्हें मैं शब्दकोश में परिवर्तित करना चाहता हूं डेटाटाइप का कोई संयोजन हो सकता है। पिछले समाधान के साथ इस तरह के मुद्दे के रूप में कर रहे हैं:

  1. वस्तुओं के लिए सभी नंबरों को परिवर्तित ही काम करता है अगर आप नंबरों का उपयोग करने की जरूरत नहीं है - मैं रकम और औसत जो इसके अलावा दशमलव मुद्दा reintroduces गणना करने के लिए विकल्प चाहते हैं एक्स दशमलव की संख्याओं के
  2. फोर्स राउंडिंग या तो सटीकता को कम या डेटा के आधार पर उपयोगकर्ता अतिरिक्त अनावश्यक 0s जोड़ने

प्रदान करता है तो, एक उच्च स्तर पर होगा, मेरे सवाल यह है:

है वहाँ एक बेहतर तरीका है यह सुनिश्चित करने के लिए कि संख्याओं को संशोधित नहीं किया जा रहा है, लेकिन एक संख्यात्मक डेटाटाइप में रखा जाता है? क्या यह बदलने का सवाल है कि मैं पहली जगह सीएसवी डेटा कैसे आयात करता हूं? निश्चित रूप से एक साधारण समाधान है जिसे मैं देख रहा हूं?

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

'df.to_json (ओरिएंट = 'रिकॉर्ड')' का प्रयोग क्यों न अंत उद्देश्य json उपयोग करने के लिए है या नहीं? – Zero

+0

@ जोहानगाल्ट मूल रूप से, स्तंभों के गतिशील घोंसले की अनुमति देने के लिए, मैं जो शब्दकोष I_dict का उपयोग कर बना रहा हूं उसे एक बड़े शब्दकोश में डाला गया है जिसे मैं बना रहा हूं, जो अंत में एक JSON पर डंप हो जाता है। –

+0

आप 'pd.io.json.dumps (nested_dicts_with_pd_objects) 'का उपयोग कर सकते हैं, क्या यह आपके लिए काम करता है? आदर्श रूप से, इसे गोल परिदृश्य पेश नहीं करना चाहिए। – Zero

उत्तर

2

आप pd.io.json.dumps इस्तेमाल कर सकते हैं पांडा वस्तुओं के साथ नेस्टेड dicts को संभालने के लिए:

यहाँ एक सरल स्क्रिप्ट है कि इस बग पुन: पेश करेंगे।

चलिए डेटाफ्रेम रिकॉर्ड और कस्टम मीट्रिक के साथ summary dict बनाते हैं।

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}}' 

का प्रयोग करें, double_precision युगल की अधिकतम अंकों परिशुद्धता को बदलने के लिए। नोटिस। df_metric मूल्य।

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}}' 

आप orient='records/index/..' का उपयोग dataframe को संभालने के लिए कर सकता है -> to_json निर्माण।

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 -, रिकर्सिवली JSON में मनमाना वस्तु धर्मान्तरित जो आंतरिक रूप से, का उपयोग करता है ultrajson

संबंधित मुद्दे

 संबंधित मुद्दे