Pandalar DataFrame'de virgül içeren sayı dizelerini float'a dönüştürme


92

Binlik işareti için virgül içeren dizeler olarak sayılar içeren bir DataFrame'im var. Onları şamandıraya dönüştürmem gerekiyor.

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

Locale.atof kullanmam gerektiğini tahmin ediyorum. Aslında

df[0].apply(locale.atof)

beklendiği gibi çalışıyor. Bir dizi şamandıra alıyorum.

Ancak bunu DataFrame'e uyguladığımda bir hata alıyorum.

df.apply(locale.atof)

TypeError: ("seri dönüştürülemiyor", 0 'dizininde meydana geldi)

ve

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

başka bir hata veriyor:

ValueError: ('float () için geçersiz hazır bilgi: 1.200', 0 dizininde u 'oluştu')

Öyleyse, bunu DataFramedizelerin bir DataFrame'ine nasıl dönüştürebilirim ?


2
Eski soru, ancak OP bu hatayı alıyor çünkü applybir DataFrame'de bütün bir sütunu işleve bir dizi olarak aktarıyor (bu durumda locale.atof, bir dizge bekleniyor). applymapAşağıdaki cevapta @AndyHayden'ın yaptığı yöntemi kullanırsanız, bunu gayet iyi yapabilmelisiniz.
TC Proctor

Yanıtlar:


149

Eğer csv'den okuyorsanız , binler argümanını kullanabilirsiniz :

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

Bu yöntemin, işlemi ayrı bir adım olarak gerçekleştirmekten daha verimli olması muhtemeldir.


Önce yerel ayarı ayarlamanız gerekir :

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

Yerel ayarı yaptığımı söylemeliydim. Hala hatayı alıyorum.
pheon

2
Ama ben df.read_fwf kullanıyorum ve bunda da "binlerce = ','" seçeneği var, bu da çalışıyor. Teşekkürler.
pheon

Öyleyse, neden df.applymap (atof) sizin için çalışıyor ama benim için çalışmıyor? Yerel ayarım 'en_US.UTF-8'.
pheon

12
Bunu read_csv işlevi için 'binlerce' argüman ipucu için oyladım. Bu benim için harika çalıştı.
rockfakie

4
Kayan sayılarla uğraşıyorsanız "decimal = '," "de kullanabileceğinizi eklemek istedim.
VessoVit

34

Pandas.Series.str.replace yöntemini kullanabilirsiniz :

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

Bu yöntem, dizedeki virgülü kaldırabilir veya değiştirebilir.


1
"AttributeError:" DataFrame "nesnesinin" str "özniteliği yok", neden olduğu hakkında hiçbir fikrim yok ...
krassowski

1
Ama bu işe yarıyor:df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

22

Bir seferde bir sütunu şu şekilde dönüştürebilirsiniz:

df['colname'] = df['colname'].str.replace(',', '').astype(float)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.