Учить вас, как изучать панд, не моя цель,Моя цель — научить вас легко играть в панд.. Я представлю очки знаний Pandas через серию примеров, чтобы вам не было скучно на пути к изучению Pandas.
Отказ от ответственности: что я написалЛегко играть Учебники Pandas бесплатны, если это поможет вам, вы можете продолжать следовать за мной.
существуетПодробное объяснение структуры данных Pandas | Легко играть с Pandas (1)Представляет две часто используемые структуры данных Series и DataFrame в Pandas, Вот некоторые общие функции этих структур данных.
# 导入相关库
import numpy as np
import pandas as pd
Часто используемые основные функции
Когда мы создаем Series и DataFrame, какие функции мы часто используем? Приходите ко мне. Ссылаясь на сценарий из предыдущей главы, у нас есть некоторая информация о пользователе, и мы храним ее в DataFrame.
Поскольку в большинстве случаев DataFrame используется чаще, чем Series, это пример DataFrame, но на самом деле многие общие функции также применимы к Series.
index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
data = {
"age": [18, 30, 25, 40],
"city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"],
"sex": ["male", "male", "female", "male"]
}
user_info = pd.DataFrame(data=data, index=index)
user_info
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Bob | 30 | ShangHai | male |
Mary | 25 | GuangZhou | female |
James | 40 | ShenZhen | male |
Как правило, чтобы получить данные, первый шаг, который нам нужно сделать, — это понять общую ситуацию с данными, которую можно использовать.info
способ просмотра.
user_info.info()
Index: 4 entries, Tom to James
Data columns (total 3 columns):
age 4 non-null int64
city 4 non-null object
sex 4 non-null object
dtypes: int64(1), object(2)
memory usage: 128.0+ bytes
Если наш объем данных очень велик, и я хочу посмотреть, как выглядят данные, я, конечно, не хочу видеть все данные.В настоящее время мы можем использовать только n элементов в начале или n элементов в хвосте . Чтобы просмотреть n фрагментов данных в заголовке, вы можете использоватьhead
метод, чтобы просмотреть n данных в хвосте, вы можете использоватьtail
метод.
user_info.head(2)
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Bob | 30 | ShangHai | male |
Кроме того, структуры данных в Pandas имеют общие методы и свойства в ndarray, например через.shape
Получить форму данных с помощью.T
Получите транспонирование данных.
user_info.shape
(4, 3)
user_info.T
name | Tom | Bob | Mary | James |
---|---|---|---|---|
age | 18 | 30 | 25 | 40 |
city | BeiJing | ShangHai | GuangZhou | ShenZhen |
sex | male | male | female | male |
Если мы хотим получить исходные данные, содержащиеся в DataFrame, мы можем передать.values
Чтобы получить, тип данных после получения на самом деле является ndarray.
user_info.values
array([[18, 'BeiJing', 'male'],
[30, 'ShangHai', 'male'],
[25, 'GuangZhou', 'female'],
[40, 'ShenZhen', 'male']], dtype=object)
Описательный и статистический
Иногда после получения данных мы хотим проверить простые статистические показатели данных (максимальное значение, минимальное значение, среднее значение, медиана и т. д.), например, мы хотим проверить максимальное значение возраста. Это?
прямо кage
Эта колонка вызываетmax
метод.
user_info.age.max()
40
Точно так же, позвонивmin
,mean
,quantile
,sum
Методы могут реализовывать минимум, среднее значение, медиану и суммирование. Видно, что дляSeries
После вызова этих методов возвращается только агрегированный результат.
Вот интересный метод:cumsum
, посмотрите на имя и найдите его иsum
Метод имеет значение, на самом деле имеет значение,cumsum
также используется для подведения итогов, но используется длясовокупная сумма, то есть он получает тот же результат, что и исходныйSeries
илиDataFrame
тот же размер.
user_info.age.cumsum()
name
Tom 18
Bob 48
Mary 73
James 113
Name: age, dtype: int64
можно увидеть,cummax
Конечный результат представляет собой сумму результата предыдущей суммы и исходного текущего значения в качестве текущего значения. Это звучит немного запутанно. Например, приведенный выше73 = 48 + 25
.cumsum
Его также можно использовать для управления объектами строкового типа.
user_info.sex.cumsum()
name
Tom male
Bob malemale
Mary malemalefemale
James malemalefemalemale
Name: sex, dtype: object
Если вы хотите получить больше статистических методов, вы можете обратиться к официальной ссылке:Descriptive statistics
Хотя существуют соответствующие методы для различных общих статистических значений, если я хочу получить несколько индикаторов, мне нужно вызывать метод несколько раз.Не кажется ли это немного хлопотным?
Дизайнеры Pandas, естественно, учли это.Чтобы получить сразу несколько статистических показателей, достаточно вызватьdescribe
метод.
user_info.describe()
age | |
---|---|
count | 4.000000 |
mean | 28.250000 |
std | 9.251126 |
min | 18.000000 |
25% | 23.250000 |
50% | 27.500000 |
75% | 32.500000 |
max | 40.000000 |
Как видите, звоните напрямуюdescribe
После метода будут отображаться некоторые статистические показатели столбцов числового типа, такие как общее количество, среднее значение, стандартное отклонение, минимальное значение, максимальное значение, квантиль 25%/50%/75%. Если вы хотите просмотреть статистику нечисловых столбцов, вы можете установить include=["object"] для ее получения.
user_info.describe(include=["object"])
city | sex | |
---|---|---|
count | 4 | 4 |
unique | 4 | 2 |
top | BeiJing | male |
freq | 1 | 3 |
Приведенные выше результаты показывают некоторые статистические показатели нечисловых столбцов: общее количество, количество дубликатов, наиболее распространенное значение, частота наиболее распространенного значения.
Кроме того, если я хочуПодсчитайте количество вхождений каждого значения в столбце, как добиться этого быстро? перечислитьvalue_counts
быстрый способ получитьSeries
Количество вхождений каждого значения в .
user_info.sex.value_counts()
male 3
female 1
Name: sex, dtype: int64
Если вы хотите получить индекс, соответствующий максимальному или минимальному значению столбца, вы можете использоватьidxmax
илиidxmin
метод завершен.
user_info.age.idxmax()
'James'
дискретность
Иногда мы сталкиваемся с такой потребностью, что мы хотим дискретизировать (ковшировать) возраст, грубо говоря, это разделить возраст на несколько интервалов, здесь мы хотим разделить возраст на 3 интервала. вы можете использовать пандыcut
метод для завершения.
pd.cut(user_info.age, 3)
name
Tom (17.978, 25.333]
Bob (25.333, 32.667]
Mary (17.978, 25.333]
James (32.667, 40.0]
Name: age, dtype: category
Categories (3, interval[float64]): [(17.978, 25.333] < (25.333, 32.667] < (32.667, 40.0]]
можно увидеть,cut
Равноудаленный дискретный интервал генерируется автоматически, и это не проблема, если вы хотите определить его самостоятельно.
pd.cut(user_info.age, [1, 18, 30, 50])
name
Tom (1, 18]
Bob (18, 30]
Mary (18, 30]
James (30, 50]
Name: age, dtype: category
Categories (3, interval[int64]): [(1, 18] < (18, 30] < (30, 50]]
Иногда после дискретизации, если вы хотите дать каждому интервалу имя, вы можете указать параметр labels.
pd.cut(user_info.age, [1, 18, 30, 50], labels=["childhood", "youth", "middle"])
name
Tom childhood
Bob youth
Mary youth
James middle
Name: age, dtype: category
Categories (3, object): [childhood < youth < middle]
за исключением того, что вы можете использоватьcut
Помимо дискретизации,qcut
Также возможна дискретизация.cut
дискретизируется в соответствии с размером каждого значения,qcut
дискретизируется в соответствии с количеством вхождений каждого значения.
pd.qcut(user_info.age, 3)
name
Tom (17.999, 25.0]
Bob (25.0, 30.0]
Mary (17.999, 25.0]
James (30.0, 40.0]
Name: age, dtype: category
Categories (3, interval[float64]): [(17.999, 25.0] < (25.0, 30.0] < (30.0, 40.0]]
Функция сортировки
В анализе данных без сортировки данных не обойтись. Pandas поддерживает два метода сортировки: сортировка по оси (индекс или столбец) и сортировка по фактическому значению.
Давайте сначала посмотрим на сортировку по индексу:sort_index
По умолчанию методы сортируются в положительном порядке по индексу.
user_info.sort_index()
age | city | sex | |
---|---|---|---|
name | |||
Bob | 30 | ShangHai | male |
James | 40 | ShenZhen | male |
Mary | 25 | GuangZhou | female |
Tom | 18 | BeiJing | male |
Если вы хотите отсортировать в обратном порядке по столбцу, вы можете установить параметрaxis=1
иascending=False
.
user_info.sort_index(axis=1, ascending=False)
sex | city | age | |
---|---|---|---|
name | |||
Tom | male | BeiJing | 18 |
Bob | male | ShangHai | 30 |
Mary | female | GuangZhou | 25 |
James | male | ShenZhen | 40 |
Если вы хотите реализовать сортировку по фактическому значению, например, хотите сортировать по возрасту, как это реализовать?
использоватьsort_values
метод, установка параметровby="age"
Вот и все.
user_info.sort_values(by="age")
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Mary | 25 | GuangZhou | female |
Bob | 30 | ShangHai | male |
James | 40 | ShenZhen | male |
Иногда нам может понадобиться отсортировать по нескольким значениям, например: чтобы отсортировать по возрасту и городу вместе, вы можете задать параметр в виде списка.
Уведомление:Порядок каждого элемента в списке влияет на приоритет сортировки..
user_info.sort_values(by=["age", "city"])
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Mary | 25 | GuangZhou | female |
Bob | 30 | ShangHai | male |
James | 40 | ShenZhen | male |
Как правило, после сортировки нам может потребоваться получить наибольшее значение n или наименьшее значение n, мы можем использоватьnlargest
иnsmallest
метод для достижения этого, чем сначала сортировка, а затем использованиеhead(n)
способ гораздо быстрее.
user_info.age.nlargest(2)
name
James 40
Bob 30
Name: age, dtype: int64
приложение функции
Хотя Pandas предоставляет нам очень богатые функции, иногда нам может потребоваться настроить некоторые функции и применить их к DataFrame или Series. Часто используемые функции:map
,apply
,applymap
.
map
— это метод, специфичный для Серии, с помощью которого можно преобразовать каждый элемент Серии.
Если я хочу определить, является ли пользователь среднего возраста по возрасту (старше 30 лет — средний возраст), передайтеmap
Это легко сделать.
# 接收一个 lambda 函数
user_info.age.map(lambda x: "yes" if x >= 30 else "no")
name
Tom no
Bob yes
Mary no
James yes
Name: age, dtype: object
Другой пример, если я хочу судить, юг это или север по городу, я могу сделать это.
city_map = {
"BeiJing": "north",
"ShangHai": "south",
"GuangZhou": "south",
"ShenZhen": "south"
}
# 传入一个 map
user_info.city.map(city_map)
name
Tom north
Bob south
Mary south
James south
Name: city, dtype: object
apply
Этот метод поддерживает как Series, так и DataFrame и работает с каждым значением при работе с Series и со всеми строками или всеми столбцами при работе с DataFrame (черезaxis
контроль параметров).
# 对 Series 来说,apply 方法 与 map 方法区别不大。
user_info.age.apply(lambda x: "yes" if x >= 30 else "no")
name
Tom no
Bob yes
Mary no
James yes
Name: age, dtype: object
# 对 DataFrame 来说,apply 方法的作用对象是一行或一列数据(一个Series)
user_info.apply(lambda x: x.max(), axis=0)
age 40
city ShenZhen
sex male
dtype: object
applymap
Этот метод специфичен для DataFrame, он действует на каждый элемент в DataFrame, и его действие на DataFrame аналогичноapply
Эффекты в сериале.
user_info.applymap(lambda x: str(x).lower())
age | city | sex | |
---|---|---|---|
name | |||
Tom | 18 | beijing | male |
Bob | 30 | shanghai | male |
Mary | 25 | guangzhou | female |
James | 40 | shenzhen | male |
Изменить имена столбцов/индексов
В процессе использования DataFrame часто приходится изменять имена столбцов, имена индексов и т. д. использоватьrename
Легко достичь.
Изменение имени столбца необходимо только для установки параметровcolumns
Вот и все.
user_info.rename(columns={"age": "Age", "city": "City", "sex": "Sex"})
Age | City | Sex | |
---|---|---|---|
name | |||
Tom | 18 | BeiJing | male |
Bob | 30 | ShangHai | male |
Mary | 25 | GuangZhou | female |
James | 40 | ShenZhen | male |
Точно так же изменение имени индекса требует только установки параметровindex
Вот и все.
user_info.rename(index={"Tom": "tom", "Bob": "bob"})
age | city | sex | |
---|---|---|---|
name | |||
tom | 18 | BeiJing | male |
bob | 30 | ShangHai | male |
Mary | 25 | GuangZhou | female |
James | 40 | ShenZhen | male |
тип операции
Если вы хотите получить количество столбцов каждого типа, вы можете использоватьget_dtype_counts
метод.
user_info.get_dtype_counts()
int64 1
object 2
dtype: int64
Если вы хотите преобразовать тип данных, вы можете передатьastype
Что нужно сделать.
user_info["age"].astype(float)
name
Tom 18.0
Bob 30.0
Mary 25.0
James 40.0
Name: age, dtype: float64
Иногда это включает в себя преобразование типа объекта в другие типы, причем общие преобразуются в числа, даты и разницу во времени, которые соответствуют Pandas.to_numeric
,to_datetime
,to_timedelta
метод.
Здесь, чтобы добавить некоторую информацию о росте для этих пользователей.
user_info["height"] = ["178", "168", "178", "180cm"]
user_info
age | city | sex | height | |
---|---|---|---|---|
name | ||||
Tom | 18 | BeiJing | male | 178 |
Bob | 30 | ShangHai | male | 168 |
Mary | 25 | GuangZhou | female | 178 |
James | 40 | ShenZhen | male | 180cm |
Теперь преобразуйте столбец высоты в число. Очевидно, что 180 см — это не число. Чтобы принудительно преобразовать, мы можем передатьerrors
Параметр, функцией этого параметра является метод обработки в случае сбоя принудительного преобразования.
по умолчанию,errors='raise'
, что означает, что исключение генерируется сразу после неудачного приведения, устанавливаяerrors='coerce'
Рассматриваемому элементу можно присвоить pd.NaT (для datetime и timedelta) или np.nan (число) в случае сбоя приведения. настраиватьerrors='ignore'
Исходные данные могут быть возвращены в случае сбоя принудительного обновления.
pd.to_numeric(user_info.height, errors="coerce")
name
Tom 178.0
Bob 168.0
Mary 178.0
James NaN
Name: height, dtype: float64
pd.to_numeric(user_info.height, errors="ignore")
name
Tom 178
Bob 168
Mary 178
James 180cm
Name: height, dtype: object
Чтобы узнать больше об искусственном интеллекте, обратите внимание на общедоступный номер:Фракция ИИ
Здесь я упорядочиваю содержание всей статьи в формате pdf, и те, кто хочет файл в формате pdf, могут ответить на ключевые слова в фоновом режиме официального аккаунта:pandas02.
Для получения дополнительной информации о пандах см.:Играйте с пандами с легкостью