পান্ডাস ডেটা ফ্রেমে কমা দিয়ে সংখ্যা স্ট্রিংকে ভাসতে রূপান্তর করুন


92

আমার কাছে একটি ডাটাফ্রেম রয়েছে যাতে হাজার হাজার মার্কারের জন্য কমা সহ স্ট্রিং হিসাবে সংখ্যা রয়েছে। আমার সেগুলি ফ্লোটে রূপান্তর করা দরকার।

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

আমি অনুমান করছি যে আমার লোকাল.আটফ ব্যবহার করা দরকার। প্রকৃতপক্ষে

df[0].apply(locale.atof)

প্রত্যাশিত হিসাবে কাজ করে। আমি একটি ধারাবাহিক ফ্লোট পাই।

তবে আমি যখন এটি ডেটাফ্রেমে প্রয়োগ করি তখন আমি একটি ত্রুটি পাই।

df.apply(locale.atof)

প্রকারের ত্রুটি: ("সিরিজটি রূপান্তর করতে পারে না", সূচক 0 'তে u'occurred)

এবং

df[0:1].apply(locale.atof)

অন্য একটি ত্রুটি দেয়:

মান মূল্য: ('ফ্লোটের জন্য অবৈধ আক্ষরিক (): 1,200', সূচক 0 তে u'occurred))

সুতরাং, আমি কীভাবে এই DataFrameস্ট্রিংগুলিকে ফ্লোটের ডেটাফ্রেমে রূপান্তর করব ?


4
পুরানো প্রশ্ন, তবে ওপি সেই ত্রুটিটি পাচ্ছে কারণ applyএকটি ডেটাফ্রেমে একটি পুরো কলামটি সিরিজ হিসাবে ফাংশনে সরিয়ে দেয় (এই ক্ষেত্রে locale.atof, যা স্ট্রিং প্রত্যাশা করে)। আপনি যদি applymapনীচের উত্তরে @ অ্যান্ডি হেডেন যে পদ্ধতিটি ব্যবহার করেন তবে আপনি এটি ঠিকঠাক করতে সক্ষম হবেন।
টিসি প্রক্টর

উত্তর:


148

আপনি যদি সিএসভি থেকে পড়ছেন তবে আপনি হাজার হাজার আরগ ব্যবহার করতে পারেন :

df.read_csv('foo.tsv', sep='\t', thousands=',')

এই পদ্ধতিটি পৃথক পদক্ষেপ হিসাবে অপারেশন করার চেয়ে আরও দক্ষ হওয়ার সম্ভাবনা রয়েছে।


আপনাকে প্রথমে লোকেলটি সেট করতে হবে :

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00

আমার বলা উচিত ছিল যে আমি লোকালটি সেট করেছি। আমি এখনও ত্রুটি পেতে।
pheon

4
তবে আমি df.read_fwf ব্যবহার করছি, এবং এটিতে "হাজার = ','" বিকল্পও রয়েছে, যা কাজ করে। ধন্যবাদ
pheon

তারপরে আবার, কেন df.applymap (atof) আমার জন্য কাজ করে না? আমার স্থানীয় অবস্থান 'en_US.UTF-8'।
pheon

12
আমি read_csv ফাংশনটির জন্য 'হাজার' আর্গুমেন্ট টিপের জন্য এটি দিয়েছি। এটা আমার জন্য দুর্দান্ত কাজ করেছে
রকফাকি

4
আমি যুক্ত করতে চেয়েছিলাম যে আপনি যদি ফ্লোট নিয়ে কাজ করছেন তবে আপনি "দশমিক = ','" ব্যবহার করতে পারেন।
ভেসোভিট

34

আপনি পান্ডাস.সেসরিস.স্টেরিয়র স্থান পদ্ধতিটি ব্যবহার করতে পারেন :

df.iloc[:,:].str.replace(',', '').astype(float)

এই পদ্ধতিটি স্ট্রিংয়ে কমাটি সরিয়ে বা প্রতিস্থাপন করতে পারে।


4
আমি "AttributeError: 'DataFrame' অবজেক্টটির কোনও 'ਗੁਣ' নেই, কোনও ধারণা নেই কেন ...
krasowski

4
তবে এটি কাজ করে:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
ক্র্যাসভস্কি

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