Прежде чем продолжить эту публикацию, важно понять разницу между NaN и None . Один тип с плавающей запятой, другой тип объекта. Pandas лучше подходит для работы со скалярными типами, поскольку многие методы для этих типов можно векторизовать. Pandas пытается последовательно обрабатывать None и NaN, но NumPy не может.
Мое предложение ( и предложение Энди ) - придерживаться NaN.
Но чтобы ответить на ваш вопрос ...
pandas> = 0.18: использовать na_values=['-']
аргумент сread_csv
Если вы загрузили эти данные из CSV / Excel, у меня для вас хорошие новости. Вы можете подавить это в корне во время загрузки данных вместо того, чтобы писать исправление с кодом в качестве следующего шага.
Большинство pd.read_*
функций (например, read_csv
и read_excel
) принимают na_values
атрибут.
file.csv
A,B
-,1
3,-
2,-
5,3
1,-2
-5,4
-1,-1
-,0
9,0
Теперь, чтобы преобразовать -
символы в NaN, выполните
import pandas as pd
df = pd.read_csv('file.csv', na_values=['-'])
df
A B
0 NaN 1.0
1 3.0 NaN
2 2.0 NaN
3 5.0 3.0
4 1.0 -2.0
5 -5.0 4.0
6 -1.0 -1.0
7 NaN 0.0
8 9.0 0.0
И аналогично для других функций / форматов файлов.
PS: В версии 0.24 + вы можете сохранить целочисленный тип, даже если в вашем столбце есть NaN (да, поговорим о том, чтобы съесть торт и съесть его тоже). Вы можете указатьdtype='Int32'
df = pd.read_csv('file.csv', na_values=['-'], dtype='Int32')
df
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
df.dtypes
A Int32
B Int32
dtype: object
Dtype - это не обычный тип int ... а скорее целочисленный тип, допускающий значение NULL . Есть и другие варианты.
Обработка числовых данных: pd.to_numeric
сerrors='coerce
Если вы имеете дело с числовыми данными, более быстрым решением является использование pd.to_numeric
с errors='coerce'
аргументом, который принуждает недопустимые значения (значения , которые не могут быть Чугунные числовые) NaN.
pd.to_numeric(df['A'], errors='coerce')
0 NaN
1 3.0
2 2.0
3 5.0
4 1.0
5 -5.0
6 -1.0
7 NaN
8 9.0
Name: A, dtype: float64
Чтобы сохранить (обнуляемый) целочисленный dtype, используйте
pd.to_numeric(df['A'], errors='coerce').astype('Int32')
0 NaN
1 3
2 2
3 5
4 1
5 -5
6 -1
7 NaN
8 9
Name: A, dtype: Int32
Чтобы привести несколько столбцов, используйте apply
:
df[['A', 'B']].apply(pd.to_numeric, errors='coerce').astype('Int32')
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
... и присвоить результат обратно после.
Более подробную информацию можно найти в этом ответе .
write_frame
не разбираетNaN
s наnone
s?