Функция df.astype() в Pandas
df.astype()Это функция в Pandas для преобразования типов данных DataFrame или Series.
При обработке данных несоответствие типов данных — распространённая проблема. Например, числа, хранящиеся как строки, даты, хранящиеся как текст, и т. д.astype()Она позволяет явно преобразовывать данные в требуемый тип, например в целое число, число с плавающей точкой, строку, дату и т. д., обеспечивая корректное вычисление и анализ данных.
Базовый синтаксис и параметры
astype()Это одновременно метод-член DataFrame и метод-член Series, вызываемый через оператор точки.для вызова.
Формат синтаксиса
DataFrame.astype(dtype, copy=True, errors='raise') Series.astype(dtype, copy=True, errors='raise')
Описание параметра
| Параметр | Type | Обязательно? | Описание | Значение по умолчанию |
|---|---|---|---|---|
| dtype | Python dtype или numpy dtype | Обязательный | Целевой тип данных. Это может быть тип Python (например,int、str), тип NumPy (например,np.int64、np.float32), или тип Pandas (например,'int64'、'float64'、'category')。 |
Отсутствует |
| copy | bool | Optional | Если он равенTrue, всегда возвращать новый объект; если этоFalse, изменять исходный объект, когда это возможно. |
True |
| errors | str | Optional | Управляет обработкой ошибок.'raise'Указывает, что при неудачном преобразовании возникает исключение;'ignore'Указывает, что при неудачном преобразовании возвращаются исходные данные без создания исключения. |
'raise' |
Описание возвращаемого значения
- Возвращает новый DataFrame или Series, в котором типы данных всех указанных столбцов были преобразованы к целевому типу.
Примеры
Давайте тщательно освоим на серии примеровastype()использование.
Пример 1: Преобразование типа данных одного столбца
Преобразовать столбец Series или DataFrame к указанному типу.
Пример
# Создать DataFrame, в котором значения хранятся как строки
data = {
'Имя': ['Чжан Сань', 'Ли Сы', 'Ван У', 'Чжао Лю'],
'age': ['25', '30', '35', '28'], # Сохранить как строку
'Salary': ['5000', '6000', '5500', '7000'] # Сохранить как строку
}
df = pd.DataFrame(data)
print("Исходный тип данных:")
print(df.dtypes)
print("=" * 50)
# Преобразовать столбец "Age" к целочисленному типу
df['age'] = df['age'].astype(int)
print(Тип данных столбца age после преобразования:)
print(df.dtypes)
print("=" * 50)
# Преобразовать столбец 'Salary' к типу float
df['Salary'] = df['Salary'].astype(float)
print(Тип данных столбца salary после преобразования:)
print(df.dtypes)
print("=" * 50)
print("Преобразованные данные:")
print(df)
Ожидаемый вывод:
原始数据类型:
姓名 object
年龄 object # 字符串类型
薪资 object # 字符串类型
==================================================
转换年龄列后的数据类型:
姓名 object
年龄 int64 # 整数类型
薪资 object
==================================================
转换薪资列后的数据类型:
姓名 object
年龄 int64
薪资 float64 # 浮点数类型
==================================================
转换后的数据:
姓名 年龄 薪资
0 张三 25 5000.0
1 李四 30 6000.0
2 王五 35 5500.0
3 赵六 28 7000.0
Пояснение кода:
- В исходных данных 'age' и 'salary' оба имеют строковый тип (
object)。 - Используйте
df['列名'].astype(int)чтобы преобразовать строки в целые числа. - После преобразования можно выполнять числовые вычисления, например суммирование, среднее и т. д.
Пример 2: Преобразование типов данных всего DataFrame
Можно указать типы данных для всего DataFrame сразу.
Пример
# Создать DataFrame
data = {
'A': [1, 2, 3, 4],
'B': [1.5, 2.5, 3.5, 4.5],
'C': ['a', 'b', 'c', 'd']
}
df = pd.DataFrame(data)
print("Исходный тип данных:")
print(df.dtypes)
print("=" * 50)
# Преобразовать столбец A в float64, а столбец B в int64
df_converted = df.astype({'A': 'float64', 'B': 'int64'})
print(Преобразованные типы данных:)
print(df_converted.dtypes)
print("=" * 50)
print("Преобразованные данные:")
print(df_converted)
Ожидаемый вывод:
原始数据类型:
A int64
B float64
C object
==================================================
转换后的数据类型:
A float64
B int64 # 小数部分被截断
C object
==================================================
转换后的数据:
A B C
0 1.0 2 a
1 2.0 2 b
2 3.0 3 c
3 4.0 4 d
Пояснение кода:
- Используйте словарь
{'Column Name': 'Type'}Можно указать типы преобразования для нескольких столбцов одновременно. - При преобразовании значений float в столбце B в целые числа дробная часть отбрасывается (2.5 становится 2).
Пример 3: Преобразование в категориальный тип данных
Категориальный тип данных (category) может экономить память, особенно подходит для столбцов с ограниченным набором значений.
Пример
# Создайте DataFrame с множеством повторяющихся значений
data = {
'city': ['Пекин', 'Шанхай', 'Гуанчжоу', 'Шэньчжэнь', 'Пекин', 'Шанхай', 'Гуанчжоу', 'Shenzhen'] * 1000,
Числовой: диапазон(8000)
}
df = pd.DataFrame(data)
print("Исходный тип данных:")
print(df.dtypes)
print(fИспользование памяти: {df.memory_usage(deep=True).sum() / 1024:.2f} KB)
print("=" * 50)
# Преобразовать столбец "City" в категориальный тип
df['city'] = df['city'].astype('category')
print(Преобразованные типы данных:)
print(df.dtypes)
print(fИспользование памяти: {df.memory_usage(deep=True).sum() / 1024:.2f} KB)
Ожидаемый вывод:
原始数据类型: 城市 object 编号 int64 内存使用: ~456 KB ================================================== 转换后的数据类型: 城市 category 编号 int64 内存使用: ~120 KB # 内存使用大幅减少
Пояснение кода:
- Категориальный тип данных присваивает целочисленный идентификатор каждому уникальному значению, экономя много памяти по сравнению с хранением полных символьных строк.
- Исходные данные содержат 8000 строк и занимают около 456 KB памяти; после преобразования — около 120 KB, что экономит около 75% памяти.
- Этот метод особенно подходит для категориальных переменных с небольшим количеством значений.
Пример 4: Преобразование в тип Datetime
Преобразуйте строки в тип datetime, чтобы можно было выполнять операции с датами.
Пример
# Создайте DataFrame со строками дат
data = {
Date: ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04'],
'Sales': [100, 150, 120, 180]
}
df = pd.DataFrame(data)
print("Исходный тип данных:")
print(df.dtypes)
print("=" * 50)
# Преобразуйте столбец "date" в тип datetime
df[Date] = pd.to_datetime(df[Date])
print(Преобразованные типы данных:)
print(df.dtypes)
print("=" * 50)
print("Преобразованные данные:")
print(df)
# Теперь вы можете выполнять операции с датами
print(nИзвлечь месяц:)
print(df[Date].dt.month)
Ожидаемый вывод:
原始数据类型:
日期 object # 字符串类型
销量 int64
==================================================
转换后的数据类型:
日期 datetime64[ns] # 日期时间类型
销量 int64
==================================================
转换后的数据:
日期 销量
0 2024-01-01 100
1 2024-01-02 150
2 2024-01-03 120
3 2024-01-04 180
提取月份:
0 1
1 1
2 1
3 1
Name: 日期, dtype: int64
Пояснение кода:
- Используйте
pd.to_datetime()чтобы преобразовать строки в тип datetime. - После преобразования вы можете использовать
.dtаксессор для выполнения операций с датами, таких как извлечение месяца, дня недели и т. д. - Примечание: хотя вы также можете использовать
astype('datetime64[ns]'), ноpd.to_datetime()обладает большей мощностью и гибкостью.
Пример 5: Обработка ошибок преобразования
Используйтеerrors='ignore'параметр для обработки сбоев преобразования.
Пример
# Создайте Series, содержащий значения, которые невозможно преобразовать в целые числа
s = pd.Series(['1', '2', 'hello', '4', 'world'])
print(“Исходные данные:”)
print(s)
print("=" * 50)
# Попробуйте преобразование. Использование errors='raise' (по умолчанию) вызовет исключение.
try:
s_converted = s.astype(int)
except ValueError as e:
print(fОшибка преобразования: {e})
print("=" * 50)
# Используйте errors='ignore', чтобы вернуть исходные данные, когда преобразование не удаётся
s_converted = s.astype(int, errors='ignore')
print("Данные преобразованы с использованием errors='ignore':")
print(s_converted)
print("=" * 50)
# Используйте errors='coerce', чтобы заполнить NaN, когда преобразование не удаётся
s_converted2 = s.astype(float, errors='coerce')
print("Данные преобразованы с использованием errors='coerce':")
print(s_converted2)
Ожидаемый вывод:
原始数据: 0 1 1 2 2 hello # 无法转换为整数 3 4 4 world # 无法转换为整数 ================================================== 转换失败: invalid literal for int() with base 10: 'hello' ================================================== 使用 errors='ignore' 转换后的数据: 0 1 1 2 2 hello # 保持原值 3 4 4 world # 保持原值 ================================================== 使用 errors='coerce' 转换后的数据: 0 1.0 1 2.0 2 NaN # 无法转换,设为 NaN 3 4.0 4 NaN # 无法转换,设为 NaN
Пояснение кода:
- Когда строка содержит значение, которое невозможно преобразовать в число, по умолчанию возникает исключение
ValueErrorисключение. errors='ignore'оставит исходные данные без изменений.errors='coerce'установит значение, которое невозможно преобразовать, вNaN, который является распространённым методом обработки грязных данных.
Пример 6: Преобразование в логический тип
Преобразование данных в логический тип, обычно используется в условной фильтрации и логических операциях.
Пример
# Создать DataFrame, содержащий 0 и 1
data = {
'Is Member': [0, 1, 1, 0, 1],
'Is Active': ['Yes', 'No', 'Yes', 'Yes', 'No']
}
df = pd.DataFrame(data)
print("Исходные данные:")
print(df)
print("Типы исходных данных:")
print(df.dtypes)
print("=" * 50)
# Преобразовать 0/1 в логический тип
df['Is Member'] = df['Is Member'].astype(bool)
print("Типы данных после преобразования столбца Is Member:")
print(df.dtypes)
print(df)
print("=" * 50)
# Преобразование "Yes"/"No" в логический тип
df['Is Active'] = df['Is Active'].map({'Yes': True, 'No': False})
print("Данные после преобразования столбца Is Active:")
print(df)
print(df.dtypes)
Ожидаемые результаты выполнения:
原始数据: 是否会员 是否激活 0 0 是 1 1 否 2 1 是 3 0 是 4 1 否 ================================================== 转换是否会员列后的数据类型: 是否会员 bool 是否激活 object ================================================== 转换是否激活列后的数据: 是否会员 是否激活 0 True True 1 True False 2 True True 3 False True 4 True False
Анализ кода:
- 0 можно преобразовать в
False, 1 преобразуется вTrue。 - Для строк вроде "Yes"/"No" нужно использовать
map()для преобразования. - После преобразования можно использовать логическую индексацию для быстрой фильтрации.
Примечания
astype()По умолчанию возвращается новый объект, а исходные данные не изменяются. Если нужно изменить данные на месте, можно использоватьcopy=Falseпараметр, но это может повлиять на исходные данные.- При преобразовании чисел с плавающей запятой в целые числа дробная часть отбрасывается, а не округляется.
- При преобразовании строк в числа убедитесь, что строка имеет допустимый числовой формат, иначе будет выброшено исключение.
- Использование
errors='coerce'является рекомендуемым методом обработки грязных данных и может преобразовывать недопустимые значения вNaN, затем используйтеfillna()для заполнения. - Для столбцов с множеством повторяющихся значений преобразование в категориальный тип может значительно сократить использование памяти.
Другие расширения