Преобразование строк в числа с плавающей запятой в DataFrame

113

Как преобразовать столбец DataFrame, содержащий строки и NaNзначения, в числа с плавающей запятой. И есть еще один столбец, значениями которого являются строки и числа с плавающей запятой; как преобразовать весь этот столбец в числа с плавающей запятой.

Нир
источник
7
НЕ ИСПОЛЬЗУЙТЕ convert_objects. Это устарело. Используйте to_numericили astypeвместо
Тед Петру

Ответы:

72

ПРИМЕЧАНИЕ: pd.convert_objects теперь устарело. Вы должны использовать pd.Series.astype(float)или, pd.to_numericкак описано в других ответах.

Это доступно в версии 0.11. Принудительное преобразование (или установка в nan). Это будет работать, даже если astypeне удастся; его также серия за серией, поэтому он не будет преобразовывать, скажем, полный строковый столбец

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
Джефф
источник
Обратите внимание, что это не работает для столбцов (в leadt multiindex), работает только для значений в
фрейме данных
1
Мне пришлось использовать set_levels для преобразования строки в float
denfromufa
16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Вы можете преобразовать только один столбец.
Джек
19
теперь это pd.to_numeric (col) в новых версиях
Джефф
11
convert_objects устарел в новых pandas. Используйте преобразователи для конкретных типов данных pd.to_numeric.
Thomas Matthew
58

Можете попробовать df.column_name = df.column_name.astype(float). Что касается NaNзначений, вам нужно указать, как они должны быть преобразованы, но вы можете использовать .fillnaметод для этого.

Пример:

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

В более новой версии pandas (0.17 и выше) вы можете использовать функцию to_numeric . Он позволяет конвертировать весь фрейм данных или только отдельные столбцы. Это также дает вам возможность выбрать, как обращаться с вещами, которые нельзя преобразовать в числовые значения:

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
Чтобы применить pd.to_numericк a DataFrame, можно использовать, df.apply(pd.to_numeric)как подробно описано в этом ответе .
Ninjakannon
31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 
Клод КУЛОМБ
источник
6
Это не работает при преобразовании из String в Float:ValueError: could not convert string to float: 'date'
Джек,
@ Джек, ты знаешь обходной путь? Я сталкиваюсь с этой точной проблемой преобразования строки в float.
Hatt
@Hatt, я столкнулся с той же проблемой. вы нашли решение для этого?
Пракхар Джуделе
@Jack Я не уверен, но вы, кажется, путаете формат даты и плавающий. # преобразовать в datetime df ['date'] = pd.to_datetime (df ['date'])
Клод КУЛОМБ
8

вы должны заменить пустые строки ('') на np.nan перед преобразованием в float. то есть:

df['a']=df.a.replace('',np.nan).astype(float)
Пол Мваники
источник
1

Вот пример

                            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

но если это все строковые значения ... как было в моем случае ... Преобразуйте нужные столбцы в числа с плавающей запятой:

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)

Теперь ваш фрейм данных будет иметь значения с плавающей запятой :-)

ArmandduPlessis
источник