Учить вас, как изучать панд, не моя цель,Моя цель — научить вас легко играть в панд.. Я представлю очки знаний 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 |
Чтобы узнать больше об искусственном интеллекте, обратите внимание на общедоступный номер:Фракция ИИ
Здесь я упорядочиваю содержание всей статьи в формате pdf, и те, кто хочет файл в формате pdf, могут ответить на ключевые слова в фоновом режиме официального аккаунта:pandas01.
Для получения дополнительной информации о пандах см.:Играйте с пандами с легкостью