Подробное объяснение структуры данных Pandas | Легко играть с Pandas (1)

искусственный интеллект Python анализ данных NumPy pandas

Учить вас, как изучать панд, не моя цель,Моя цель — научить вас легко играть в панд.. Я представлю очки знаний Pandas через серию примеров, чтобы вам не было скучно на пути к изучению Pandas.

Отказ от ответственности: что я написалЛегко играть Учебники Pandas бесплатны, если это поможет вам, вы можете продолжать следовать за мной.

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

В Pandas есть две часто используемые структуры данных: Series и DataFrame. Эти структуры данных построены поверх массивов Numpy, что означает, что они очень эффективны. Давайте посмотрим, как выглядит каждая из этих структур данных.

# 导入相关库
import numpy as np
import pandas as pd

Series

Введение

Серия - этоназваниеОдномерный массив и индекс, поскольку это массив, нужно сказать, что тип элемента в массиве, тип данных, содержащийся в серии, может быть целым числом, с плавающей запятой, строкой, объектом Python и т. д.

Предположим, есть сценарий: сохранить некоторую информацию о пользователе, временно включив только информацию о возрасте.

Мы можем хранить через Series, здесь мы храним четыре возраста через Series: 18/30/25/40,Просто создайте данные, которые будут храниться в массиве, и назначьте их параметру данных..

# 存储了 4 个年龄:18/30/25/40
user_age = pd.Series(data=[18, 30, 25, 40])
user_age
0    18
1    30
2    25
3    40
dtype: int64

Как видите, несколько возрастов были правильно сохранены в Series, вы можете подумать, какой смысл хранить возрасты отдельно, как узнать, какому пользователю принадлежит этот возраст?

Мы можем решить эту проблему с помощью индекса Series. Поскольку существует четыре возраста, естественно, требуются четыре имени, поэтому мыНеобходимо построить массив той же длины, что и данные, а затем выполните следующие действия, чтобы выполнить требования.

user_age.index = ["Tom", "Bob", "Mary", "James"]
user_age
Tom      18
Bob      30
Mary     25
James    40
dtype: int64

Видите ли, имя и возраст теперь полностью совпадают. Хотя мы знаем, что Том/Боб — это имена, а другие — нет, как мы можем рассказать другим?

Чтобы другие знали, мы можем дать индексу имя.

user_age.index.name = "name"
user_age
name
Tom      18
Bob      30
Mary     25
James    40
dtype: int64

Вы также можете подумать, если другие смотрят на написанный мной код, как они могут быстро узнать, что я пишу?

Не волнуйтесь, точно так же, как мы дали индексу имя, мы также можем дать имя серии.

user_age.name="user_age_info"
user_age
name
Tom      18
Bob      30
Mary     25
James    40
Name: user_age_info, dtype: int64

Благодаря приведенной выше серии операций у нас есть базовое понимание структуры Серии.Серия содержит данные, индекс и имя.

Вышеуказанные операции очень удобно использовать для демонстрации.Если вы хотите быстро реализовать вышеперечисленные функции, то это можно сделать следующими способами.

# 构建索引
name = pd.Index(["Tom", "Bob", "Mary", "James"], name="name")
# 构建 Series
user_age = pd.Series(data=[18, 30, 25, 40], index=name, name="user_age_info")
user_age
name
Tom      18
Bob      30
Mary     25
James    40
Name: user_age_info, dtype: int64

Кроме того, следует отметить, что когда мы строили серию, мы не устанавливали тип данных каждого элемента, в настоящее время Pandas автоматически определяет тип данных и использует его в качестве типа серии.

Конечно, мы также можем вручную указать тип данных.

# 指定类型为浮点型
user_age = pd.Series(data=[18, 30, 25, 40], index=name, name="user_age_info", dtype=float)
user_age
name
Tom      18.0
Bob      30.0
Mary     25.0
James    40.0
Name: user_age_info, dtype: float64

Серия как что

Series содержит характеристики dict, что означает, что можно использовать некоторые операции, аналогичные dict. Мы можем думать об элементах в индексе как о ключах в словаре.

# 获取 Tom 的年龄
user_age["Tom"]
18.0

Кроме того, его можно получить с помощью метода get. Преимущество этого подхода заключается в том, что при отсутствии индекса исключений не возникает.

user_age.get("Tom")
18.0

Помимо того, что он похож на dict, Series также очень похож на ndarray, что означает, что можно использовать операции среза.

# 获取第一个元素
user_age[0]
18.0
# 获取前三个元素
user_age[:3]
name
Tom     18.0
Bob     30.0
Mary    25.0
Name: user_age_info, dtype: float64
# 获取年龄大于30的元素
user_age[user_age > 30]
name
James    40.0
Name: user_age_info, dtype: float64
# 获取第4个和第二个元素
user_age[[3, 1]]
name
James    40.0
Bob      30.0
Name: user_age_info, dtype: float64

Как видите, независимо от того, как мы манипулируем Серией путем нарезки, она автоматически выравнивает индексы.

Векторизованные операции над сериями

Series, как и ndarray, также поддерживает векторизованные операции. Его также можно передать большинству методов NumPy, которые ожидают ndarray.

user_age + 1
name
Tom      19.0
Bob      31.0
Mary     26.0
James    41.0
Name: user_age_info, dtype: float64
np.exp(user_age)
name
Tom      6.565997e+07
Bob      1.068647e+13
Mary     7.200490e+10
James    2.353853e+17
Name: user_age_info, dtype: float64

DataFrame

DataFrame — этопоказательДвумерная структура данных, в которой каждый столбец может иметь собственное имя и разные типы данных. Вы можете думать об этом как о таблице Excel или таблице в базе данных, DataFrame является наиболее часто используемым объектом Pandas.

Мы продолжаем использовать предыдущий пример для объяснения DataFrame, при сохранении информации о пользователе, помимо возраста, я также хочу сохранить город пользователя. Как это сделать с DataFrame?

Словарь может быть создан, ключ — это информация, которую нужно сохранить, а значение — это список информации.Затем передайте dict параметру данных.

index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")

data = {
    "age": [18, 30, 25, 40],
    "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"]
}

user_info = pd.DataFrame(data=data, index=index)
user_info
age city
name
Tom 18 BeiJing
Bob 30 ShangHai
Mary 25 GuangZhou
James 40 ShenZhen

Как видите, мы успешно создали DataFrame, индекс этого DataFrame — это пол пользователя, а два столбца — это возраст пользователя и информация о городе.

В дополнение к описанному выше способу передачи в dict мы также можем построить его другим способом. Этот путьСначала создайте 2D-массив, а затем создайте список имен столбцов..

data = [[18, "BeiJing"], 
        [30, "ShangHai"], 
        [25, "GuangZhou"], 
        [40, "ShenZhen"]]
columns = ["age", "city"]

user_info = pd.DataFrame(data=data, index=index, columns=columns)
user_info
age city
name
Tom 18 BeiJing
Bob 30 ShangHai
Mary 25 GuangZhou
James 40 ShenZhen

строка доступа

После создания DataFrame вы можете видеть, что каждая строка представляет информацию определенного пользователя.Что мне делать, если я хочу получить доступ к информации Тома?

Один из способов — получить доступ к строке по ее индексному имени, что требует помощи метода loc.

user_info.loc["Tom"]
age          18
city    BeiJing
Name: Tom, dtype: object

Помимо прямого доступа к строке данных через имя индекса, вы также можете выбрать эту строку по ее местоположению.

user_info.iloc[0]
age          18
city    BeiJing
Name: Tom, dtype: object

Теперь, когда я могу получить доступ к информации определенного пользователя, как я могу получить доступ к информации нескольких пользователей? То есть, как получить доступ к нескольким строкам?

Это легко сделать с помощью нарезки строк, см. здесь.

user_info.iloc[1:3]
age city
name
Bob 30 ShangHai
Mary 25 GuangZhou

столбец доступа

В дополнение к изучению того, как получить доступ к данным строк, естественно подумать о том, как получить доступ к столбцам. Мы можем получить доступ к данным этого столбца с помощью атрибутов ("имя столбца") или мы можем получить доступ к данным этого столбца в виде [столбец].

Если я хочу получить возраст всех пользователей, я могу сделать это.

user_info.age
name
Tom      18
Bob      30
Mary     25
James    40
Name: age, dtype: int64
user_info["age"]
name
Tom      18
Bob      30
Mary     25
James    40
Name: age, dtype: int64

Что делать, если вы хотите получить возраст и город одновременно?

# 可以变换列的顺序
user_info[["city", "age"]]
city age
name
Tom BeiJing 18
Bob ShangHai 30
Mary GuangZhou 25
James ShenZhen 40

добавить/удалить столбцы

После создания DataFrame вы вдруг обнаружите, что информация о поле пользователя отсутствует, так как же ее добавить?

Если все гендеры одинаковы, мы можем заполнить все позиции, передав скаляр, и Pandas будет автоматически транслировать для нас.

user_info["sex"] = "male"
user_info
age city sex
name
Tom 18 BeiJing male
Bob 30 ShangHai male
Mary 25 GuangZhou male
James 40 ShenZhen male

Если вы хотите удалить столбец, вы можете использовать для этого метод pop.

user_info.pop("sex")
user_info
age city
name
Tom 18 BeiJing
Bob 30 ShangHai
Mary 25 GuangZhou
James 40 ShenZhen

Если пол пользователя непостоянен, мы можем добавить новый столбец, передав ему список лайков.

user_info["sex"] = ["male", "male", "female", "male"]
user_info
age city sex
name
Tom 18 BeiJing male
Bob 30 ShangHai male
Mary 25 GuangZhou female
James 40 ShenZhen male

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

Если мы хотим гарантировать, что исходный DataFrame не изменится, мы можем создать новый столбец с помощью метода assign.

user_info.assign(age_add_one = user_info["age"] + 1)
age city sex age_add_one
name
Tom 18 BeiJing male 19
Bob 30 ShangHai male 31
Mary 25 GuangZhou female 26
James 40 ShenZhen male 41
user_info.assign(sex_code = np.where(user_info["sex"] == "male", 1, 0))
age city sex sex_code
name
Tom 18 BeiJing male 1
Bob 30 ShangHai male 1
Mary 25 GuangZhou female 0
James 40 ShenZhen male 1

Чтобы узнать больше об искусственном интеллекте, обратите внимание на общедоступный номер:Фракция ИИ

qrcode_for_gh_60cef389e81c_258.jpg

Здесь я упорядочиваю содержание всей статьи в формате pdf, и те, кто хочет файл в формате pdf, могут ответить на ключевые слова в фоновом режиме официального аккаунта:pandas01.

Для получения дополнительной информации о пандах см.:Играйте с пандами с легкостью