Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер
Всем привет, меня зовут Питер~
Это восьмая часть серии Pandas: операции с типами данных Pandas.
Основная операция обработки данных, анализа и других операций заключается в том, что мы правильно устанавливаем тип данных.Автор часто сталкивается с проблемой, что тип данных не обрабатывается заранее, что приводит к невозможности выполнения последующих операций.
В этой статье представлены три основных метода преобразования типов данных в Pandas и представлен метод получения чисел на основе типов данных:
- Кастинг с помощью функции astype()
- Преобразование типов данных с помощью пользовательских функций
- Функция использует как предоставлено Pandas преобразование to_numeric(), to_datetime() или тому подобное
- Функция SELECT_DTYPES
Типы данных, поддерживаемые Pandas, Python и Numpy
В следующей таблице показаны типы данных, поддерживаемые в Pandas, Python и Numpy, Вы можете видеть, что типы, поддерживаемые в пандах, являются наиболее распространенными.
Данные моделирования
Импорт данных
Ниже приведены смоделированные данные, содержащие несколько имен полей.
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv("数据类型操作.csv")
df
Представление типа данных
Просмотрите тип поля данных:
df.dtypes # 各字段的数据类型
df.team.dtype # 某个字段的类型
s.dtype # Series 的类型
df.dtypes.value_counts() # 各类型有多少个字段
фактический случай
Преобразование символьного типа в числовой тип
Например, мы хотим выполнить некоторые операции с данными, такие как добавление данных «2019» и «2020»: очевидно, что данные не являются тем результатом, который нам нужен.
Основная причина: эти два поля являются символьными типами, а операция + предназначена для прямого соединения содержимого вместе, а не для добавления значений внутри.
Правильная работа:
1. Сначала извлеките числа из этих двух полей.
# 分割之后取出第1个元素
df["2020年_新"] = df["2020年"].apply(lambda x:x.split("元")[0])
df["2019年_新"] = df["2019年"].apply(lambda x:x.split("元")[0])
df
2. Просмотр типа данных
Два новых сгенерированных поля по-прежнему имеют символьный тип и не могут быть добавлены напрямую.
3. Преобразование символьных данных цифрового фенотипа в числовой тип
Есть два способа выполнить это требование:
- pd.astype("float") : указать тип
- to_numeric(): прямое преобразование
## 字符类型的数值转成纯数值型
# 等价写法:df["2020年_新"] = df.astype({"2020年_新":"int") 字典形式传入
df["2020年_新"] = df["2020年_新"].astype("int")
df['2019年_新'] = pd.to_numeric(df['2019年_新'], errors='coerce')
df
3. Добавьте два новых поля
df["前两年之和"] = df["2020年_新"] + df["2019年_新"]
df
Найдите разницу между двумя годами:
Преобразование числового типа в символьный тип
Найдите темп роста на 2020 год:
df["增长率"] = df["前两年之差"] / df["2019年_新"]
df
Теперь, когда вся скорость роста представляет собой числовое значение с плавающей запятой, мы хотим преобразовать его в форму %, которая является символьным типом данных:
顾客姓名 object
顾客编码 int64
客户部门 object
客户组别 float64
2019年 object
2020年 object
日 int64
月 int64
年 int64
是否大客户 object
2020年_新 int64
2019年_新 int64
前两年之和 int64
前两年之差 int64
增长率 float64 # 数值型数据
dtype: object
Вот два способа выполнить вышеуказанные требования:
- Способ 1: Преобразование через функцию str
- Способ 2: форматированный вывод через функцию форматирования
df["增长率1"] = df["增长率"].apply(lambda x: str(round(100*x,2)) + "%")
df["增长率2"] = df["增长率"].apply(lambda x: format(x,'.2%'))
df
顾客姓名 object
顾客编码 int64
客户部门 object
客户组别 float64
2019年 object
2020年 object
日 int64
月 int64
年 int64
是否大客户 object
2020年_新 int64
2019年_新 int64
前两年之和 int64
前两年之差 int64
增长率 float64
增长率1 object # 两个字符类型的数据
增长率2 object
dtype: object
Числовые данные с пропущенными значениями
Если большая часть данных в поле является числовой, но есть небольшое количество пропущенных значений, вы можете использовать следующие методы для преобразования:
df["客户组别"] = pd.to_numeric(df['客户组别'], errors='coerce').fillna(0) # 未知的组用0代替;0可以换成其他数值
df
Преобразование числового типа в тип времени
Если в реальных данных мы встречаем данные, похожие на год, месяц, день и т. д., мы можем преобразовать их: например, мы хотим сгенерировать поле дня рождения на основе года, месяца и дня в данных.
1. Приведенные выше день, месяц и год теперь являются числовыми данными, которые нельзя добавить напрямую.Сначала преобразуйте их:
df["月"] = df["月"].astype(str)
df["年"] = df["年"].astype(str)
2. После преобразования в символьные данные добавьте:
df["生日"] = df["年"] + "-" + df["月"] + "-" + df["日"]
df
3. Преобразование данных типа времени в pandas через pd.to_datetime
df["生日"] = df["生日"].apply(lambda x: pd.to_datetime(x,format="%Y-%m-%d"))
df.dtypes
После проверки: если поле представлено на английском языке, следующий метод может быть напрямую преобразован в тип DateTime64 [NS], при использовании китайских символов в качестве имени атрибутов этот метод не применим. Функция TO_DETETIME () в пандах может сочетать отдельный год, месяц и конечные столбцы в один меток времени:
pd.to_datetime(df[['year', 'month', 'day']]) # 组合成日期
Использование логического оценочного суждения
Например, если это крупный клиент, мы хотим заменить Y на True, а N на False, чего можно добиться с помощью np.where:
df["是否大客户"] = np.where(df["是否大客户"] == "Y", True, False)
df
прямое преобразование чтения файлов
При использовании pandas для чтения файла мы можем напрямую изменить тип данных, используя преобразователи параметров:
df0 = pd.read_csv("数据类型操作.csv",
converters={
"顾客编码":str, # 指定改变的函数
"2019年":lambda x:float(x.split("元")[0]), # 切割函数
"2020年":lambda x:float(x.replace("元","")), # 替换函数
"客户组别":lambda x: pd.to_numeric(x, errors='coerce'),
"是否大客户":lambda x:np.where(x == "Y",True,False)
}
)
df0
Считать по типу данных
Давайте посмотрим на типы данных, которые существуют в данных df: object, int64, float64, bool, datetime64[ns]
df.dtypes
# 结果
顾客姓名 object
顾客编码 int64
客户部门 object
客户组别 float64
2019年 object
2020年 object
日 object
月 object
年 object
是否大客户 bool
2020年_新 int64
2019年_新 int64
前两年之和 int64
前两年之差 int64
增长率 float64
增长率1 object
增长率2 object
生日 datetime64[ns]
dtype: object
Содержит типы данных
df.select_dtypes(include=["object"]) # 包含object类型的数据
Также можно фильтровать по нескольким типам данных одновременно:
df.select_dtypes(include=["object","bool"])
Не содержит типов данных
df.select_dtypes(exclude=["object"]) # 不包含object类型的数据
Исключить несколько типов данных поля одновременно:
df.select_dtypes(exclude=["object","bool"]) # 两个类型的数据同时排除
Суммировать
Первый шаг в работе с данными — убедиться, что мы установили правильный тип данных, а затем мы можем выполнить ряд операций, таких как последующая обработка данных, анализ данных и визуализация. Различные типы данных могут обрабатываться по-разному.
Обратите внимание, что столбец может иметь только один общий тип данных. В этой статье рассказывается об общем преобразовании типов данных в Pandas и методе получения чисел на основе типов данных, в надежде помочь читателям.