Bir DataFrame'de dizeleri kayan noktalara dönüştürme


113

Dizeler ve NaNdeğerler içeren bir DataFrame sütunu kayan değerlere nasıl dönüştürülür. Ve değerleri dizeler ve yüzer olan başka bir sütun daha var; bu sütunun tamamı kayan sayılara nasıl dönüştürülür.


7
KULLANMAYIN convert_objects. Kullanımdan kaldırıldı. Kullan to_numericya da astypeyerine
Ted Petrou

Yanıtlar:


72

NOT: pd.convert_objects artık kullanımdan kaldırılmıştır. Diğer cevaplarda açıklandığı gibi pd.Series.astype(float)veya kullanmalısınız pd.to_numeric.

Bu, 0.11'de mevcuttur. Kuvvet dönüşümü (veya seti nan) Bu astype, başarısız olduğunda bile çalışacaktır; aynı zamanda seriye göre seridir, böylece tam bir dize sütununu dönüştürmez

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo'])))

In [11]: df
Out[11]: 
     A    B
0  1.0  1.0
1    1  foo

In [12]: df.dtypes
Out[12]: 
A    object
B    object
dtype: object

In [13]: df.convert_objects(convert_numeric=True)
Out[13]: 
   A   B
0  1   1
1  1 NaN

In [14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]: 
A    float64
B    float64
dtype: object

Lütfen bunun sütunlar için çalışmadığını unutmayın (leadt multiindex'te), sadece veri çerçevesindeki değerler için çalışır
denfromufa

1
Ben yüzer dönüştürme dizeye kullanım set_levels zorunda kaldı
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Sadece tek bir sütunu dönüştürebilirsiniz.
Jack

19
bu artık daha yeni sürümlerde pd.to_numeric (col) oldu
Jeff

11
convert_objects yeni pandalarda kullanımdan kaldırılmıştır. Veri türüne özgü dönüştürücüleri pd.to_numeric kullanın.
Thomas Matthew

58

Deneyebilirsin df.column_name = df.column_name.astype(float). NaNDeğerlere gelince , bunların nasıl dönüştürüleceğini belirlemeniz gerekir, ancak bunu .fillnayapmak için yöntemi kullanabilirsiniz .

Misal:

In [12]: df
Out[12]: 
     a    b
0  0.1  0.2
1  NaN  0.3
2  0.4  0.5

In [13]: df.a.values
Out[13]: array(['0.1', nan, '0.4'], dtype=object)

In [14]: df.a = df.a.astype(float).fillna(0.0)

In [15]: df
Out[15]: 
     a    b
0  0.1  0.2
1  0.0  0.3
2  0.4  0.5

In [16]: df.a.values
Out[16]: array([ 0.1,  0. ,  0.4])

47

Pandaların daha yeni bir sürümünde (0.17 ve üzeri), to_numeric işlevini kullanabilirsiniz . Tüm veri çerçevesini veya yalnızca tek tek sütunları dönüştürmenize olanak tanır. Ayrıca, sayısal değerlere dönüştürülemeyen şeylerin nasıl ele alınacağını seçme yeteneği de verir:

import pandas as pd
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s)
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')
pd.to_numeric(s, errors='coerce')

32
A'ya başvurmak pd.to_numericiçin DataFrame, bu cevapta ayrıntılıdf.apply(pd.to_numeric) olarak açıklandığı gibi kullanılabilir .
Ninjakannon

31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 

6
Bu, String'den ValueError: could not convert string to float: 'date'
Jack

@Jack buradaki çözümü biliyor musunuz? Dizeyi float'a dönüştüren tam bu sorunla karşılaşıyorum.
Hatt

@Hatt aynı sorunla karşı karşıyayım. bunun için çözümü buldunuz mu?
Prakhar Jhudele

@Jack Emin değilim ama tarih formatını ve kaymayı karıştırıyorsun. # datetime df'ye dönüştür ['tarih'] = pd.to_datetime (df ['tarih'])
Claude COULOMBE

8

float türüne dönüştürmeden önce boş dizeleri ('') np.nan ile değiştirmeniz gerekir. yani:

df['a']=df.a.replace('',np.nan).astype(float)

1

İşte bir örnek

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

ancak bunların tümü dize değerleriyse ... benim durumumda olduğu gibi ... İstenen sütunları kayan sayılara dönüştürün:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

Veri çerçeveniz artık kayan değerlere sahip olacak :-)

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.