Введение в Python pandas.DataFrame

Одна из первых концепций, которые мы изучаем как программисты Python, касается встроенных структур данных, таких как list и dictionary.

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

Почему pandas.DataFrame?

Потому что pandas.DataFrame - одна из наиболее часто используемых структур данных Python, и не зря. Это экономит время и нервы, и если вы собираетесь читать, сотрудничать или заимствовать код других программистов, вы обязательно увидите DataFrames раньше, чем позже.

Об этом руководстве

Отличный способ учиться на практике.

Этот учебник включает упражнения, призванные мягко познакомить вас с миром pandas.DataFrame.

В руководстве используется подмножество данных из популярного набора данных Titanic (если вы изучаете науку о данных, вы увидите снова набор данных Титаник).

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

Загрузите CSV-файл Titanic в среду программирования Python 3:

1. Download titanic_names.csv.zip
2. Unzip titanic_names.csv.zip into your Python 3 environment

краткий обзор pandas и DataFrame

pandas - мощный пакет Python, широко используемый для анализа данных. Это упрощает задачи по загрузке, анализу и управлению данными, которые в противном случае потребовали бы слишком много строк кода Python.

DataFrame - это структура данных (точно так же, как list и dictionary - это структуры данных), включенная в пакет pandas.

По данным сайта Pandas:

DataFrame - это двумерная помеченная структура данных со столбцами потенциально разных типов. Вы можете думать об этом как о электронной таблице или таблице SQL, или как о наборе объектов Series. Обычно это наиболее часто используемый объект pandas. Как и Series, DataFrame принимает множество различных типов ввода…

Пример представления DataFrame

Как видите, структура DataFrame очень похожа на электронную таблицу или таблицу базы данных:

Приступим к руководству…

Импортировать данные в DataFrame

Pandas имеет множество функций чтения, которые импортируют внешний источник данных (например, текстовый файл CSV или HTML) и возвращают DataFrame.

Используйте read_csv(), чтобы загрузить данные Титаника из этого руководства.

# import pandas - the pd alias for pandas is a widely used standard
import pandas as pd
titanic_df = pd.read_csv("titanic_names.csv") 

Успешный read_csv() не имеет выхода. Посмотрим, что он создал…

Просмотр фрейма данных

3 функции и метода для создания DataFrameare вида с высоты птичьего полета: shape, head() и describe().

Сколько строк и столбцов?

# display row and column counts
titanic_df.shape

891 ряд и 6 столбцов.

Как выглядят данные?

titanic_df.head()

head() отображает первые 5 записей. Чтобы увидеть меньше или больше записей, передайте целое число, например: head(10).

Примечание: в левой части таблицы DataFrame перечислены последовательные целые числа 0, 1,…, 4. Это «индекс» или «метка строки». Мы обсудим индексы немного позже в этом руководстве.

Есть ли статистика по данным?

titanic_df.describe()

describe() выводит сводку описательной статистики. Замечает, что результат - это сам DataFrame.

В этом примере строка count содержит количество ненулевых значений в каждом числовом столбце titanic_df. Столбец Возраст содержит 714 ненулевых значений, что означает, что в остальных 891 записях Возраст = null (без значения). Как аналитик, вы можете быть обеспокоены нулевыми значениями.

Щелкните здесь для получения более подробной статистики и методов расчета, например: count(), max(), min(), mean(), std(), sum(), dtypes()

Щелкните здесь для получения дополнительных сведений о базовой структуре и метаданных.

Теперь, когда у вас есть представление о том, как выглядит DataFrame, давайте создадим его с нуля…

Создать DataFrame вручную

Синтаксис

pandas.DataFrame (данные, индекс, столбцы, dtype, копия)

Создайте простой DataFrame

Определите первый параметр, data, как простой список [«A», «B», «C»]. Примите значения по умолчанию для всех остальных параметров и посмотрите, что произойдет:

pd.DataFrame(['A','B','C'])

Обратите внимание на индексы (или метки строк) слева. По умолчанию они используют последовательность диапазонов, начинающуюся с 0.

Создайте DataFrame с массивом списков

Попрактикуйтесь в использовании параметров, передавая метки индекса и столбца, и задайте тип данных float:

pd.DataFrame(
    [
        [1,2,3],
        [4,5,6],
        [7,8,9],
        [98,99,100]
    ], 
    index=['Row 1','Row 2','Row 3','Row 4'],
    columns=['Col 1','Col 2','Col 3'],
    dtype=float
)

Хороший.

Создайте DataFrame со словарем списков

pd.DataFrame (
    {'PassengerId': [1,2,3], 
     'Survived': [0,1,1], 
     'Pclass': [3,1,3], 
     'Name': ['Braund, Mr. Owen Harris', 
              'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
              'Heikkinen, Miss. Laina'],
     'Sex': ['male','female','female'],
     'Age': [22.0, 38.0, 26.0]
    }
)

Идеально.

Скопируйте структуру данных в DataFrame

Другой способ создания DataFrame - это копирование из существующей структуры данных, такой как: список словарей, нарраи / списки, Series (структура панд) и список серий.

Копировать из списка словарей

Используйте метод from_dict().

titanic_dict = [
    {'PassengerId': 1, 'Survived': 0, 'Pclass': 3, 
     'Name': 'Braund, Mr. Owen Harris', 
     'Sex': 'male', 'Age': 22.0}, 
    {'PassengerId': 2, 'Survived': 1, 'Pclass': 1, 
     'Name': 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)', 
     'Sex': 'female', 'Age': 38.0}, 
    {'PassengerId': 3, 'Survived': 1, 'Pclass': 3, 
     'Name': 'Heikkinen, Miss. Laina', 
     'Sex': 'female', 'Age': 26.0}
    ]
# Copy list of dictionaries into a DataFrame
small_titanic_df = pd.DataFrame.from_dict(titanic_dict)
small_titanic_df

Для получения подробной информации о from_dict(), from_records() и других методах копирования данных на DataFrame и обратно, щелкните здесь.

Выберите определенные столбцы

Есть три метода выбора столбцов из DataFrame, и все они возвращают одинаковые результаты:

  • точечная запись
    dataframe.column_name
  • квадратные скобки с названием столбца в виде строки dataframe[‘column_name’]
  • числовая индексация и селектор iloc
    dataframe.iloc[:, <column_number>]

(включить head() метод для ограничения возвращаемых строк)

titanic_df.Age.head() 
titanic_df['Age'].head() 
titanic_df.iloc[:,5].head()

Я считаю, что версия с квадратными скобками является самой понятной и простой для чтения. Кроме того, менее подвержен ошибкам, чем iloc, если столбцы переупорядочиваются, добавляются или удаляются из DataFrame позже. Однако синтаксис нарезки iloc удобен при выборе серии столбцов.

Выберите несколько столбцов

Включите несколько имен столбцов в список.

titanic_df[['Name','Age']].head()

Выберите определенные строки

Выделите второй набор из 5 рядов, надрезав скобки внутри.

titanic_df[5:10]

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

Эти две команды одинаковы, каждая из них возвращает первые 5 строк DataFrametitanic_df.head(5) = titanic_df[0:5].

Выбирать определенные столбцы и строки одновременно

Сначала перечисляются столбцы, затем нарезаются строки.

titanic_df[['Name','Age']][5:10]

Фильтровать записи по условиям

Кому на Титанике было больше 65 лет?

titanic_df[titanic_df['Age'] > 65]

Сколько человек выжило? (0 = нет, 1 = да)

titanic_df['Survived'].value_counts()

Какова была выживаемость в процентах?

titanic_df['Survived'].value_counts(normalize=True) * 100

Какой процент пожилых выжил?

titanic_df[ titanic_df["Age"] > 65 ] \
   ["Survived"].value_counts(normalize=True) * 100

Не лучший показатель выживаемости для людей старше 65 лет.

Сортировать по значениям столбцов

Кто был 10 самыми молодыми?

titanic_df.sort_values('Age').head(10)

А как насчет 10 самых старых?

titanic_df.sort_values('Age', ascending=False).head(10)

Для получения дополнительной информации о нарезке и выборе данных щелкните здесь.

Группировать по столбцам

Сколько выживших и умерших, сгруппированных по мужчинам и женщинам?

Воспользуйтесь методом df.groupby ().

titanic_df.groupby(['Sex', 'Survived'])['PassengerId'].count()

Изменить данные

Обновите «Survived», преобразовав логическое значение в строку.

Помните, что с логическими значениями 0 = False и 1 = True.

Воспользуйтесь методом pandas.DataFrame.replace(). Сначала создайте логическое значение dictionary (boolean_d).

boolean_d = {True: 'Survived', False: 'Died'}
titanic_df['Survived'] = titanic_df['Survived'].replace(boolean_d)
titanic_df.head()

Индексирование

По умолчанию строки DataFrame индексируются последовательными целыми числами, начинающимися с 0. Что, если вместо этого мы хотим проиндексировать уже существующий столбец? Например, в столбце PassengerId?

Есть несколько способов установить индекс: преобразовать существующий столбец в индекс или установить индекс при построении DataFrame.

Преобразовать столбец в индекс

Используйте set_index().

set_index_titanic_df = titanic_df.set_index('PassengerId')
set_index_titanic_df.head()

Индексировать DataFrame при создании

Теперь давайте повторно импортируем наши тестовые данные, чтобы снова создать titanic_df с использованием read_csv, на этот раз явно назначив индекс вместо того, чтобы принимать индекс диапазона по умолчанию. Используйте параметр index_col.

indexed_titanic_df = \
    pd.read_csv("titanic_names.csv",index_col='PassengerId')
indexed_titanic_df.head()

Индексы - это не столбцы

Здесь важно отметить: теперь, когда PassengerId является индексом, он больше не столбец в DataFrame. Это демонстрируется функцией shape, которая показывает, что теперь есть 5 столбцов вместо 6 предыдущих:

indexed_titanic_df.shape

Кроме того, на индекс не ссылаются как на столбец. Например, если вы попытаетесь указать PassengerId как столбец, вы получите сообщение об ошибке:

indexed_titanic_df['PassengerId']

Преобразовать индекс в столбец

Передумали индексировать этот столбец? Не беспокойся. Просто установите его обратно, используя reset_index():

un_indexed_titanic_df = indexed_titanic_df.reset_index()
un_indexed_titanic_df.head()

Заключение (с тизером)

Этот учебник раскрывает только самую верхушку pandas.DataFrame айсберга.

Мы даже не коснулись математики, использования apply и applymap для применения функций к таблицам DataFrame, pivoting, мультииндексации, использования crosstab для проверки гипотезы, слияния, перебора строк и многого другого.

Я призываю вас продолжать изучать pandas.DataFrame и pandas библиотеку в целом.

Прежде чем вы отправитесь, вот последний тизер ...

Построение pandas.DataFrame

Одна из лучших особенностей структуры pandas иDataFrame заключается в том, насколько легко она упрощает анализ данных, особенно в сочетании с библиотекой matplotlib. matplotlib - это совершенно новая тема, поэтому вот простой пример, чтобы подогреть аппетит.

Попробуй

import pandas as pd
import matplotlib.pyplot as plt
titanic_df = pd.read_csv("titanic_names.csv")
# Draw a histogram of passenger ages
age_hist = titanic_df['Age'].hist()
age_hist.set(xlabel='Passenger Age', ylabel='Count')
plt.show()

Счастливого Python !!!

Ресурсы