Перетворення рядків у плаваючі в DataFrame


113

Як перекрити стовпчик DataFrame, що містить рядки та NaNзначення. І є ще один стовпець, значення якого - це рядки і плаває; як перетворити весь цей стовпець у плаває.


7
НЕ ВИКОРИСТОВУЙТЕ convert_objects. Це застаріло. Використовуйте to_numericабо astypeзамість цього
Тед Петру

Відповіді:


72

ПРИМІТКА. pd.convert_objects Зараз застаріле. Ви повинні використовувати pd.Series.astype(float)або pd.to_numericяк описано в інших відповідях.

Це доступно в 0,11. Сила перетворення (або встановити в нан) Це буде працювати навіть тоді, коли 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), працює лише для значень у кадрі даних
denfromufa

1
Мені довелося використовувати set_levels, щоб перетворити рядок у плаваючу
denfromufa

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)Ви можете конвертувати лише один стовпець.
Джек

19
це тепер pd.to_numeric (col) у новіших версіях
Jeff

11
У новіших пандах функція convert_objects застаріла. Використовуйте специфічні для даного типу перетворювачі pd.to_numeric.
Томас Метью

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

У новій версії панд (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до 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'
Джек

@Jack Ви знаєте вирішення тут? Я стикаюся з цією точною проблемою перетворення рядка в плаваючу.
Хатт

@Hatt Я зіткнувся з тим же питанням. ти знайшов рішення для цього?
Прахар Джудель

@Jack Я не впевнений, але ти, здається, змішує формат дати та плаває. # перетворити в datetime df ['date'] = pd.to_datetime (df ['date'])
Клод COULOMBE

8

вам доведеться замінити порожні рядки ('') на np.nan перед перетворенням у плаваючий. тобто:

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)

Ваш кадр даних тепер матиме плавні значення :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.