Saya memiliki DataFrame yang berisi angka sebagai string dengan koma untuk penanda ribuan. Saya perlu mengubahnya menjadi float.
a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)
Saya rasa saya perlu menggunakan locale.atof. Memang
df[0].apply(locale.atof)
bekerja seperti yang diharapkan. Saya mendapatkan Serangkaian pelampung.
Tetapi ketika saya menerapkannya ke DataFrame, saya mendapatkan kesalahan.
df.apply(locale.atof)
TypeError: ("tidak dapat mengonversi rangkaian menjadi", u'occurred pada indeks 0 ')
dan
df[0:1].apply(locale.atof)
memberikan kesalahan lain:
ValueError: ('literal tidak valid untuk float (): 1.200', u'occurred pada indeks 0 ')
Jadi, bagaimana cara mengonversi DataFrame
string ini menjadi DataFrame of floats?
apply
pada DataFrame melewati seluruh kolom ke fungsi sebagai rangkaian (dalam hal inilocale.atof
, yang mengharapkan string). Jika Anda menggunakanapplymap
metode yang dilakukan @AndyHayden pada jawaban di bawah, Anda seharusnya dapat melakukannya dengan baik.Jawaban:
Jika Anda membaca dari csv maka Anda dapat menggunakan ribuan arg :
df.read_csv('foo.tsv', sep='\t', thousands=',')
Metode ini mungkin lebih efisien daripada melakukan operasi sebagai langkah terpisah.
Anda perlu menyetel lokalnya terlebih dahulu:
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
sumber
Anda dapat menggunakan metode pandas.Series.str.replace :
df.iloc[:,:].str.replace(',', '').astype(float)
Metode ini dapat menghapus atau mengganti koma di string.
sumber
df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
Anda dapat mengonversi satu kolom dalam satu waktu seperti ini:
df['colname'] = df['colname'].str.replace(',', '').astype(float)
sumber