Convertendo strings em flutuantes em um DataFrame

113

Como converter uma coluna DataFrame contendo strings e NaNvalores para floats. E há outra coluna cujos valores são strings e floats; como converter esta coluna inteira em flutuantes.

Neer
fonte
7
NÃO USE convert_objects. Está obsoleto. Use to_numericou no astypelugar
Ted Petrou

Respostas:

72

NOTA: pd.convert_objects agora está obsoleto. Você deve usar pd.Series.astype(float)ou pd.to_numericconforme descrito em outras respostas.

Disponível em 0,11. Conversão de forças (ou conjunto para nan) Isso funcionará mesmo quando astypefalhará; também é série por série para que não converta, digamos, uma coluna completa

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
Jeff
fonte
Observe que isso não funciona para colunas (no multiindex inicial), funciona apenas para valores no dataframe
denfromufa
1
Tive de usar set_levels para converter string em float
denfromufa
16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Você pode converter apenas uma única coluna.
Jack
19
agora é pd.to_numeric (col) em versões mais recentes
Jeff
11
convert_objects está obsoleto nos pandas mais novos. Use os conversores específicos do tipo de dados pd.to_numeric.
Thomas Matthew
58

Você pode tentar df.column_name = df.column_name.astype(float). Quanto aos NaNvalores, você precisa especificar como eles devem ser convertidos, mas você pode usar o .fillnamétodo para fazer isso.

Exemplo:

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])
raiz
fonte
47

Em uma versão mais recente do pandas (0.17 e superior), você pode usar a função to_numeric . Ele permite que você converta todo o dataframe ou apenas colunas individuais. Também oferece a capacidade de selecionar como tratar coisas que não podem ser convertidas em valores numéricos:

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')
Salvador Dalí
fonte
32
Para aplicar pd.to_numerica a DataFrame, pode-se usar df.apply(pd.to_numeric)conforme explicado em detalhes nesta resposta .
Ninjakannon
31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
Claude COULOMBE
fonte
6
Isso não funciona na conversão de String para Float:ValueError: could not convert string to float: 'date'
Jack
@Jack, você conhece a solução alternativa aqui? Estou enfrentando esse mesmo problema de conversão de string em flutuante.
Hatt
@Hatt, estou enfrentando o mesmo problema. você encontrou a solução para isso?
Prakhar Jhudele
@Jack Não tenho certeza, mas você parece confundir formato de data e float. # converter para datetime df ['date'] = pd.to_datetime (df ['date'])
Claude COULOMBE
8

você deve substituir strings vazias ('') por np.nan antes de converter para float. ie:

df['a']=df.a.replace('',np.nan).astype(float)
Paul Mwaniki
fonte
1

Aqui está um exemplo

                            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

mas se forem todos valores de string ... como era no meu caso ... Converta as colunas desejadas em flutuantes:

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)

Seu dataframe agora terá valores flutuantes :-)

ArmandduPlessis
fonte