पंडों के साथ float64_csv


93

मैं इस तरह फ्लोट संख्या के साथ एक सीएसवी पढ़ रहा हूं:

Bob,0.085
Alice,0.005

और एक डेटाफ्रेम में आयात करें, और इस डेटाफ्रेम को एक नए स्थान पर लिखें

df = pd.read_csv(orig)
df.to_csv(pandasfile)

अब यह pandasfileहै:

Bob,0.085000000000000006
Alice,0.0050000000000000001

क्या हुआ? हो सकता है कि मुझे एक अलग प्रकार जैसे कि फ्लोट 32 या कुछ और के लिए कास्ट करना है?

Im पांडा 0.9.0 और सुन्न 1.6.2 का उपयोग कर ।


28
फ्लोटिंग पॉइंट नंबरों पर आपका स्वागत है।
इग्नासियो वाज़क्वेज़-अब्राम्स


1
मैंने यहाँ थोड़ा और विस्तार से जांच करने के लिए एक मुद्दा बनाया: github.com/pydata/pandas/issues/2069 EDIT: यदि आप कर सकते हैं, तो कृपया GitHub मुद्दे पर समस्या का स्टैंडअलोन प्रजनन करें। मैं इसे पुन: पेश करने में सक्षम नहीं हूं।
वेक मैकिनी

जवाबों:


168

जैसा कि टिप्पणियों में उल्लेख किया गया है, यह एक सामान्य फ्लोटिंग पॉइंट समस्या है।

हालाँकि आप इसे छिपाने float_formatके to_csvलिए मुख्य शब्द का उपयोग कर सकते हैं :

df.to_csv('pandasfile.csv', float_format='%.3f')

या, यदि आप नहीं चाहते कि 0.0001 को गोल से शून्य किया जाए:

df.to_csv('pandasfile.csv', float_format='%g')

तुम्हे दूंगा:

Bob,0.085
Alice,0.005

अपने आउटपुट फ़ाइल में।

की व्याख्या के लिए %g, प्रारूप विशिष्टता मिनी-भाषा देखें


मुझे एक त्रुटि मिलीTypeError: __init__() got an unexpected keyword argument 'float_format'
wand95

यदि किसी के पास @ wander95 जैसी त्रुटि है, तो आपको संभवतः pandasएक नए संस्करण में अपडेट करने की आवश्यकता है ।
ड्रिफ्टकैचर

10

अद्यतन: उत्तर लेखन के समय सटीक था, और फ़्लोटिंग पॉइंट सटीकता अभी भी कुछ ऐसी चीज़ नहीं है जो आप डिफ़ॉल्ट रूप से to_csv / read_csv (सटीक-प्रदर्शन वाले ट्रेडऑफ़; चूक पक्ष के प्रदर्शन) के साथ प्राप्त करते हैं।

आजकल वहाँ के लिए तर्क उपलब्ध और तर्क के लिए उपलब्धfloat_formatpandas.DataFrame.to_csvfloat_precisionpandas.from_csv

समस्या पर बेहतर पकड़ पाने के लिए मूल अभी भी पढ़ने लायक है।


यह पंडों में एक बग था, न केवल "to_csv" फ़ंक्शन में, बल्कि "read_csv" में भी। यह एक सामान्य फ़्लोटिंग पॉइंट मुद्दा नहीं है, हालांकि यह सच है कि फ़्लोटिंग पॉइंट अंकगणितीय एक ऐसा विषय है जो प्रोग्रामर से कुछ देखभाल की मांग करता है। नीचे यह लेख इस विषय को थोड़ा स्पष्ट करता है:

http://docs.python.org/2/tutorial/floatingpoint.html

एक क्लासिक एक-लाइनर जो "समस्या" दिखाता है ...

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

... जो 0.3 प्रदर्शित नहीं करता है क्योंकि एक की उम्मीद होगी। दूसरी ओर, यदि आप निश्चित बिंदु अंकगणित का उपयोग करके गणना को संभालते हैं और केवल अंतिम चरण में आप फ्लोटिंग पॉइंट अंकगणित को नियोजित करते हैं , तो यह आपकी अपेक्षा के अनुरूप काम करेगा। यह देखो:

>>> (1 + 1 + 1)  * 1.0 / 10
0.3

यदि आपको इस समस्या को दरकिनार करने की आवश्यकता है, तो मैं आपको एक और सीएसवी फ़ाइल बनाने की सलाह देता हूं जिसमें पूर्णांक के रूप में सभी आंकड़े हैं, उदाहरण के लिए 100, 1000 या अन्य कारक से गुणा करना जो सुविधाजनक हो। अपने एप्लिकेशन के अंदर, हमेशा की तरह CSV फ़ाइल पढ़ें और आपको उन पूर्णांक आंकड़े वापस मिल जाएंगे। फिर उन मूल्यों को फ़्लोटिंग पॉइंट में परिवर्तित करें, उसी कारक से विभाजित करें जिसे आपने पहले गुणा किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.