Функция Pandas pd.to-numeric()
pd.to_numeric()используется в библиотеке Pandas дляпреобразования данных в числовые типыфункция. Она может преобразовывать данные различных форматов (таких как строки, столбцы смешанных типов) в числовые типы, например целые числа и числа с плавающей запятой.
Это часто используемая функция при очистке данных, особенно при обработке данных, импортированных из файлов или баз данных, где часто необходимо преобразовать столбцы, которые выглядят числовыми, но на самом деле являются строками.
Определение слова: to_numericОзначает "преобразовать в числовой", то есть преобразование данных из других типов в числовые типы.
Базовый синтаксис и параметры
pd.to_numeric()— это функция верхнего уровня библиотеки Pandas, используемая для преобразования входных данных в числовые типы.
Формат синтаксиса
pd.to_numeric(arg, errors='raise', downcast=None)
Описание параметра
- Параметр:
arg- Тип: Series, list, array или объект, подобный словарю.
- Описание: данные, которые нужно преобразовать в числовые типы. Обычно Series.
- Параметр:
errors- Тип: строка ('raise', 'coerce', 'ignore').
- Описание: режим обработки ошибок.
'raise'(По умолчанию) Вызывает исключение при обнаружении значения, которое невозможно преобразовать;'coerce'Устанавливает непреобразуемые значения в NaN;'ignore'Игнорирует ошибки и возвращает исходные данные.
- Параметр:
downcast- Тип: String ('integer', 'signed', 'unsigned', 'float') или None.
Описание функций
- Возвращаемое значение: Возвращает числовой Series.
- Действие: Преобразует тип входных данных в числовой (int64 или float64).
Примеры
Давайте подробно освоим это на серии примеров от простого к сложному,pd.to_numeric()использование.
Пример 1: Базовое использование - Преобразование строк в числовые значения
Пример
# 1. Создайте Series, содержащий числовые строки
s = pd.Series(['10', '20', '30', '40', '50'])
print("=== Исходный Series (тип:", s.dtype, ")===")
print(s)
# 2. Используйте pd.to_numeric() для преобразования в числовой тип
result = pd.to_numeric(s)
print("\n=== После преобразования pd.to_numeric() (тип:", result.dtype, ")===")
print(result)
Ожидаемый вывод:
=== 原始 Series(类型: object )=== 0 10 1 20 2 30 3 40 5 50 dtype: object === pd.to_numeric() 转换后(类型: int64 )=== 0 10 1 20 2 30 3 40 4 50 dtype: int64
Анализ кода:
- Исходные данные имеют строковый тип (object), поэтому числовые операции с ними невозможны.
pd.to_numeric()После преобразования его в целочисленный тип (int64) можно выполнять математические операции.
Пример 2: Обработка строк, содержащих нечисловые значения
Использованиеerrorsпараметр может гибко обрабатывать значения, которые невозможно преобразовать.
Пример
import numpy as np
# 1. Создайте Series, содержащий нечисловые строки
s = pd.Series(['10', '20', 'abc', '40', 'example'])
print("=== Series, содержащий нечисловые значения ===")
print(s)
# 2. errors='raise' (по умолчанию) - вызывает исключение при обнаружении значения, которое невозможно преобразовать
print("\n=== errors='raise' (по умолчанию) ===)
try:
result = pd.to_numeric(s, errors='raise')
except Exception as e:
print(f"Исключение: {e}")
# 3. errors='coerce' - установите значения, которые невозможно преобразовать, в NaN
print("\n=== errors='coerce' ===")
result_coerce = pd.to_numeric(s, errors='coerce')
print(result_coerce)
# 4. errors='ignore' — игнорировать ошибки и вернуть исходные данные
print("\n=== errors='ignore' ===")
result_ignore = pd.to_numeric(s, errors='ignore')
print(result_ignore)
print(f"Тип: {result_ignore.dtype}")
Ожидаемый вывод:
=== 包含非数值的 Series === 0 10 1 20 2 abc 3 40 4 example 包含了 'abc', 'example' 等无法转换的字符串 === errors='raise'(默认)=== 异常: Unable to convert string to float explicitly === errors='coerce' === 0 10.0 1 20.0 2 NaN 3 40.0 4 NaN dtype: float64 === errors='ignore' === 0 10 1 20 2 abc 3 40 4 example Type: object
Анализ кода:
errors='coerce'Очень практично: неконвертируемые значения заменяются на NaN (пропущенные значения), а конвертируемые сохраняются.errors='ignore'Оставляет исходные данные без изменений; подходит, когда вы хотите только попробовать преобразование, не изменяя данные.
Пример 3: обработка смешанных числовых значений и пропущенных значений
В реальных данных часто приходится обрабатывать столбцы, содержащие смесь пропущенных и числовых значений.
Пример
import numpy as np
# 1. Создайте Series, содержащий пропущенные значения и числовые строки
s = pd.Series(['100', '200', None, 'N/A', '400', '', '500'])
print("=== Series, содержащий пропущенные значения и нечисловые значения ===")
print(s)
# 2. Преобразование с использованием errors='coerce'
print("\n=== Преобразовано с использованием errors='coerce' ===)
result = pd.to_numeric(s, errors='coerce')
print(result)
# 3. Проверьте, какие значения были преобразованы в NaN
print("\n=== Выявление значений NaN ===)
print(f"Позиции NaN: {result.isna().tolist()}")
# 4. Заполнить NaN значением 0 или удалить
print("\n=== Заполнение NaN значением 0 ===)
print(result.fillna(0))
Ожидаемый вывод:
=== 包含缺失值和数值字符串的 Series === 0 100 1 200 2 None 3 N/A 4 400 5 (空字符串) 6 字符串 '500' dtype: object === 使用 errors='coerce' 转换 === 0 100.0 1 200.0 даль 2 NaN 3. NaN 4 400.0 5 NaN 6 NaN dtype: float64
Анализ кода:
errors='coerce'Он может обрабатывать None, пустые строки, N/A и другие формы, представляющие пропущенные значения, преобразуя их все единообразно в NaN.- Преобразованный тип становится float64 (поскольку NaN должен быть представлен).
Пример 4: Использование параметра downcast для оптимизации памяти
Для больших наборов данных можно использоватьdowncastэтот параметр для уменьшения использования памяти.
Пример
import numpy as np
# 1. Создание Series из больших целых чисел
s = pd.Series([1, 2, 3, 4, 5] * 100000)
print("=== Исходный тип:", s.dtype)
print("=== Исходная память:", s.memory_usage(deep=True), "bytes")
# 2. Преобразовать в числовой тип без указания downcast
result_default = pd.to_numeric(s)
print("\n=== Тип после преобразования по умолчанию:", result_default.dtype)
print("=== Память по умолчанию:", result_default.memory_usage(deep=True), "bytes")
# 3. Понижающее приведение к меньшему целочисленному типу
result_signed = pd.to_numeric(s, downcast='signed')
print("\n=== тип при downcast='signed':", result_signed.dtype)
print("=== память при downcast='signed':", result_signed.memory_usage(deep=True), "bytes")
# 4. Понижающее приведение к числам с плавающей точкой
float_data = pd.Series([1.5, 2.5, 3.5] * 100000)
result_float = pd.to_numeric(float_data, downcast='float')
print("\n=== downcast='float' тип:", result_float.dtype)
print("=== downcast='float' память:", result_float.memory_usage(deep=True), "bytes")
Ожидаемый вывод:
=== 原始类型: int64 === 原始内存: 2800000 bytes === 默认转换后类型: int64 内存节省:2.8 MB -> 1.4 MB === downcast='signed' 类型: int8/int16/int32 内存节省约 50% === downcast='float' 类型: float32 内存节省约 50%
Анализ кода:
- Для больших наборов данных,
downcastэто может значительно снизить использование памяти. downcast='signed'Пытается преобразовать целые числа в наименьший знаковый целочисленный тип.downcast='float'Преобразует числа с плавающей запятой из float64 в float32.
Другие расширенияСовет:При обработке крупномасштабных данных,
pd.to_numeric()объединяяerrors='coerce'иdowncastпараметр может эффективно преобразовывать смешанные данные в числовые типы и оптимизировать память.
Pandas: общие функции