Функция df.astype() в Pandas

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 к указанному типу.

Пример

import pandas as pd

# Создать 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

Пояснение кода:

  1. В исходных данных 'age' и 'salary' оба имеют строковый тип (object)。
  2. Используйтеdf['列名'].astype(int)чтобы преобразовать строки в целые числа.
  3. После преобразования можно выполнять числовые вычисления, например суммирование, среднее и т. д.

Пример 2: Преобразование типов данных всего DataFrame

Можно указать типы данных для всего DataFrame сразу.

Пример

import pandas as pd

# Создать 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) может экономить память, особенно подходит для столбцов с ограниченным набором значений.

Пример

import pandas as pd

# Создайте 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, чтобы можно было выполнять операции с датами.

Пример

import pandas as pd

# Создайте 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'параметр для обработки сбоев преобразования.

Пример

import pandas as pd

# Создайте 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: Преобразование в логический тип

Преобразование данных в логический тип, обычно используется в условной фильтрации и логических операциях.

Пример

import pandas as pd

# Создать 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()для заполнения.
  • Для столбцов с множеством повторяющихся значений преобразование в категориальный тип может значительно сократить использование памяти.

Pandas: общие функции

Другие расширения