Подтвердить что ты не робот

Pandas: преобразование в числовое, создание NaN при необходимости

Скажем, у меня есть столбец в кадре данных, который содержит некоторые числа и некоторые не номера

>> df['foo']
0       0.0
1     103.8
2     751.1
3       0.0
4       0.0
5         -
6         -
7       0.0
8         -
9       0.0
Name: foo, Length: 9, dtype: object

Как я могу преобразовать этот столбец в np.float и иметь все, что не float, преобразовать его в NaN?

Когда я пытаюсь:

>> df['foo'].astype(np.float)

или

>> df['foo'].apply(np.float)

Я получаю ValueError: could not convert string to float: -

4b9b3361

Ответ 1

В 0.17.0 convert_objects вызывает предупреждение:

FutureWarning: convert_objects устарела. Используйте специфичные для типа данных конвертеры pd.to_datetime, pd.to_timedelta и pd.to_numeric.

Вы можете использовать метод pd.to_numeric и применить его к кадру данных с помощью arg coerce.

df1 = df.apply(pd.to_numeric, args=('coerce',))

или, может быть, более уместно:

df1 = df.apply(pd.to_numeric, errors='coerce')

РЕДАКТИРОВАТЬ

Вышеуказанный метод действителен только для версий панд> = 0.17.0, из документа Что нового в пандах 0.17.0:

pd.to_numeric - это новая функция для приведения строк к числам (возможно, с применением) (GH11133)

Ответ 2

Используйте метод convert_objectsconvert_numeric):

In [11]: s
Out[11]: 
0    103.8
1    751.1
2      0.0
3      0.0
4        -
5        -
6      0.0
7        -
8      0.0
dtype: object

In [12]: s.convert_objects(convert_numeric=True)
Out[12]: 
0    103.8
1    751.1
2      0.0
3      0.0
4      NaN
5      NaN
6      0.0
7      NaN
8      0.0
dtype: float64

Примечание: это также доступно как метод DataFrame.

Ответ 3

Сначала замените все строковые значения на None, чтобы пометить их как отсутствующие значения, а затем преобразовать их в float.

df['foo'][df['foo'] == '-'] = None
df['foo'] = df['foo'].astype(float)

Ответ 4

Вы можете просто использовать pd.to_numeric и установить ошибку на coerce без использования apply

df['foo'] = pd.to_numeric(df['foo'], errors='coerce')