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.
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]: dfOut[11]:
A B01.01.011 fooIn[12]: df.dtypesOut[12]:
A object
B object
dtype: objectIn[13]: df.convert_objects(convert_numeric=True)Out[13]:
A B01111NaNIn[14]: df.convert_objects(convert_numeric=True).dtypesOut[14]:
A float64
B float64
dtype: object
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
00.10.21NaN0.320.40.5In[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
00.10.210.00.320.40.5In[16]: df.a.values
Out[16]: array([0.1,0.,0.4])
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')
convert_objects
. Está obsoleto. Useto_numeric
ou noastype
lugarRespostas:
Disponível em 0,11. Conversão de forças (ou conjunto para nan) Isso funcionará mesmo quando
astype
falhará; também é série por série para que não converta, digamos, uma coluna completafonte
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)
Você pode converter apenas uma única coluna.Você pode tentar
df.column_name = df.column_name.astype(float)
. Quanto aosNaN
valores, você precisa especificar como eles devem ser convertidos, mas você pode usar o.fillna
método para fazer isso.Exemplo:
fonte
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:
fonte
pd.to_numeric
a aDataFrame
, pode-se usardf.apply(pd.to_numeric)
conforme explicado em detalhes nesta resposta .fonte
ValueError: could not convert string to float: 'date'
você deve substituir strings vazias ('') por np.nan antes de converter para float. ie:
fonte
Aqui está um exemplo
mas se forem todos valores de string ... como era no meu caso ... Converta as colunas desejadas em flutuantes:
Seu dataframe agora terá valores flutuantes :-)
fonte