Ubah string angka dengan koma di pandas DataFrame menjadi float

92

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 DataFramestring ini menjadi DataFrame of floats?

pheon
sumber
2
Pertanyaan lama, tetapi OP mendapatkan kesalahan itu karena applypada DataFrame melewati seluruh kolom ke fungsi sebagai rangkaian (dalam hal ini locale.atof, yang mengharapkan string). Jika Anda menggunakan applymapmetode yang dilakukan @AndyHayden pada jawaban di bawah, Anda seharusnya dapat melakukannya dengan baik.
TC Proctor

Jawaban:

149

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
Andy Hayden
sumber
Saya seharusnya mengatakan bahwa saya yang mengatur lokalnya. Saya masih mendapatkan kesalahan.
pheon
2
Tapi saya menggunakan df.read_fwf, dan itu memiliki opsi "ribuan = ','" juga, yang berfungsi. Terima kasih.
pheon
Kemudian lagi, mengapa df.applymap (atof) bekerja untuk Anda tetapi tidak untuk saya? Lokal saya adalah 'en_US.UTF-8'.
pheon
12
Saya memilih ini untuk tip argumen 'ribuan' untuk fungsi read_csv. Itu berhasil dengan baik untuk saya.
rockfakie
4
Saya ingin menambahkan bahwa Anda juga dapat menggunakan "decimal = ','" jika Anda berurusan dengan float.
VessoVit
34

Anda dapat menggunakan metode pandas.Series.str.replace :

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

Metode ini dapat menghapus atau mengganti koma di string.

shen ke
sumber
1
Saya mendapatkan "AttributeError: objek 'DataFrame' tidak memiliki atribut 'str'", tidak tahu mengapa ...
krassowski
1
Tapi ini berhasil:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski
22

Anda dapat mengonversi satu kolom dalam satu waktu seperti ini:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
ghollah kioko
sumber