पंडों में कॉमा के साथ संख्या स्ट्रिंग्स कन्वर्ट करें DataFrame तैरने के लिए


92

मेरे पास एक DataFrame है जिसमें हजारों मार्करों के लिए कॉमा के साथ संख्याएं हैं। मुझे उन्हें फ्लोट में बदलने की जरूरत है।

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

मैं अनुमान लगा रहा हूं कि मुझे locale.atof का उपयोग करने की आवश्यकता है। वास्तव में

df[0].apply(locale.atof)

उम्मीद के मुताबिक काम करता है। मुझे झांकियों की एक श्रृंखला मिलती है।

लेकिन जब मैं इसे DataFrame पर लागू करता हूं, तो मुझे एक त्रुटि मिलती है।

df.apply(locale.atof)

TypeError: ("सीरीज़ को कन्वर्ट नहीं कर सकता", यू'ऑर्केटेड एट इंडेक्स 0 ')

तथा

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

एक और त्रुटि देता है:

मान: ('फ़्लोट के लिए अमान्य शाब्दिक (): 1,200', 'सूचकांक 0 पर आधारित')

तो, मैं कैसे इस DataFrameस्ट्रिंग्स को डेटाफ्रेम की फ़्लोट्स में परिवर्तित करूं?


2
पुराना सवाल है, लेकिन ओपी को वह त्रुटि मिल रही है क्योंकि applyडेटाफ़्रेम पर एक पूरे कॉलम को एक श्रृंखला के रूप में फ़ंक्शन में पारित किया जाता है (इस मामले में locale.atof, जो एक स्ट्रिंग की उम्मीद करता है)। यदि आप उस applymapविधि का उपयोग करते हैं जो @AndyHayden नीचे दिए गए उत्तर में करती है, तो आपको यह ठीक करने में सक्षम होना चाहिए।
टीसी प्रॉक्टर

जवाबों:


149

यदि आप csv से पढ़ रहे हैं तो आप हजारों arg का उपयोग कर सकते हैं :

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

मुझे कहना चाहिए था कि मैंने लोकल सेट किया था। मुझे अभी भी त्रुटि मिलती है।
मून 3'14

2
लेकिन मैं df.read_fwf का उपयोग कर रहा हूं, और इसमें "हजारों = ','" विकल्प भी हैं, जो काम करता है। धन्यवाद।
मून 3'14

तो फिर, क्यों df.applymap (atof) आपके लिए काम करता है लेकिन मैं नहीं? मेरा स्थान 'en_US.UTF-8' है।
फॉन 3'14

12
मैंने इसे 'हजारों' तर्क टिप के लिए read_csv फ़ंक्शन के लिए दिया। मेरे लिए यह बहुत अच्छा रहा।
रॉकफैकी

4
मैं जोड़ना चाहता था कि आप "दशमलव = ','" का उपयोग कर सकते हैं यदि आप फ्लोट्स के साथ काम कर रहे हैं।
वेसोविट

34

आप pandas.Series.str.replace विधि का उपयोग कर सकते हैं :

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

यह विधि स्ट्रिंग में अल्पविराम को हटा या प्रतिस्थापित कर सकती है।


1
मुझे "एट्रिब्यूटऑवर: 'डेटाफ़्रेम' ऑब्जेक्ट में कोई विशेषता 'str' नहीं मिल रही है", पता नहीं क्यों ...
krassowski

1
लेकिन यह काम करता है:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

23

आप इस तरह एक समय में एक कॉलम को बदल सकते हैं:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.