Манипуляции с типами данных Pandas

pandas
Манипуляции с типами данных Pandas

Общественный номер: 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 и методе получения чисел на основе типов данных, в надежде помочь читателям.