পান্ডাস টু_সিএসভি দিয়ে ভাসমান 64


93

আমি এই জাতীয় ফ্লোট সংখ্যা সহ একটি সিএসভি পড়ছি:

Bob,0.085
Alice,0.005

এবং একটি ডেটাফ্রেমে আমদানি করুন এবং এই ডেটা ফ্রেমটিকে একটি নতুন জায়গায় লিখুন

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

এখন এটি pandasfileআছে:

Bob,0.085000000000000006
Alice,0.0050000000000000001

কি হল? হতে পারে আমাকে ফ্লোট 32 বা অন্য কিছুর মতো আলাদা ধরণের কাস্ট করতে হবে?

আমি পান্ডা ব্যবহার করছি 0.9.0 এবং অলস 1.6.2


28
ভাসমান পয়েন্ট সংখ্যাগুলিতে স্বাগতম।
ইগনাসিও ওয়াজকেজ-আব্রামস


4
আমি এখানে আরও কিছু বিশদে বিশদ পরীক্ষা করার জন্য একটি সমস্যা তৈরি করেছি: github.com/pydata/pandas/issues/2069 সম্পাদনা: আপনি যদি পারেন তবে দয়া করে গিটহাব ইস্যুতে সমস্যার একটি স্বতন্ত্র প্রজনন করুন। আমি এটি পুনরুত্পাদন করতে সক্ষম নই।
ওয়েস ম্যাককিনি

উত্তর:


168

মন্তব্যে উল্লিখিত হিসাবে এটি একটি সাধারণ ভাসমান সমস্যা point

তবে আপনি এটি লুকানোর জন্য 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'
ঘুরে দেখি

কারও কাছে @ wander95 এর মতো একই ত্রুটি থাকলে আপনার সম্ভবত pandasএকটি নতুন সংস্করণে আপডেট করা দরকার ।
ড্রিফ্যাচ্যাচার

10

আপডেট: লেখার সময় উত্তর সঠিক ছিল এবং ভাসমান পয়েন্ট যথার্থতা এখনও_আসভি / রিড_সিএসভি ডিফল্টরূপে পাওয়ার মতো কিছু নয় (নির্ভুলতা-সম্পাদন ট্রেড অফ; ডিফল্ট পারফরম্যান্সের পক্ষে)।

আজকাল আছে জন্য যুক্তি প্রাপ্তিসাধ্য এবং যুক্তি জন্য উপলব্ধfloat_formatpandas.DataFrame.to_csvfloat_precisionpandas.from_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 বা অন্যান্য ফ্যাক্টর দ্বারা গুণ করা যা সুবিধাজনক বলে প্রমাণিত হয়। আপনার অ্যাপ্লিকেশনটির অভ্যন্তরে, সিএসভি ফাইল যথারীতি পড়ুন এবং আপনি সেই পূর্ণসংখ্যার ফিগারগুলি ফিরে পাবেন। তারপরে সেই মানগুলিকে ভাসমান বিন্দুতে রূপান্তর করুন, আপনি আগে গুণক হিসাবে একই গুণকে ভাগ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.