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: -
Ответы
Ответ 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_objects
(и convert_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')