Как читать и записывать табличные данные?

In [1]: import pandas as pd
Данные, использованные в этом уроке:
  • В этом руководстве используется набор данных Titanic, сохраненный в формате CSV. Данные состоят из следующих столбцов:

    • PassengerId: Идентификатор каждого пассажира.

    • Survived: Имеет значения 0 и 1. 0 для не выживших и 1 для выживших.

    • Pclass: Существует 3 класса: класс 1, класс 2 и класс 3.

    • Name: Имя пассажира.

    • Sex: Пол пассажира.

    • Age: Возраст пассажира.

    • SibSp: Указание на то, что у пассажира есть братья, сестры и супруг.

    • Parch: Пассажир один или с семьей.

    • Ticket: Номер билета пассажира.

    • Fare: Указание тарифа.

    • Cabin: Каюта пассажира.

    • Embarked: Категория причала.

    Исходные данные
../../_images/02_io_readwrite.svg
  • Я хочу проанализировать данные о пассажирах Титаника, доступные в виде CSV-файла.

    In [2]: titanic = pd.read_csv("data/titanic.csv")
    

    pandas предоставляет функцию read_csv() для чтения данных, хранящихся в виде CSV-файла, в DataFrame. pandas поддерживает множество различных форматов файлов или источников данных из коробки (csv, excel, sql, json, parquet и так далее), каждый из них имеет префикс read_*.

Всегда проверяйте данные после их чтения. При отображении DataFrame по умолчанию будут отображаться первые и последние 5 строк:

In [3]: titanic
Out[3]: 
     PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
0              1         0       3  ...   7.2500   NaN         S
1              2         1       1  ...  71.2833   C85         C
2              3         1       3  ...   7.9250   NaN         S
3              4         1       1  ...  53.1000  C123         S
4              5         0       3  ...   8.0500   NaN         S
..           ...       ...     ...  ...      ...   ...       ...
886          887         0       2  ...  13.0000   NaN         S
887          888         1       1  ...  30.0000   B42         S
888          889         0       3  ...  23.4500   NaN         S
889          890         1       1  ...  30.0000  C148         C
890          891         0       3  ...   7.7500   NaN         Q

[891 rows x 12 columns]
  • Я хочу увидеть первые 8 строк DataFrame.

    In [4]: titanic.head(8)
    Out[4]: 
       PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
    0            1         0       3  ...   7.2500   NaN         S
    1            2         1       1  ...  71.2833   C85         C
    2            3         1       3  ...   7.9250   NaN         S
    3            4         1       1  ...  53.1000  C123         S
    4            5         0       3  ...   8.0500   NaN         S
    5            6         0       3  ...   8.4583   NaN         Q
    6            7         0       1  ...  51.8625   E46         S
    7            8         0       3  ...  21.0750   NaN         S
    
    [8 rows x 12 columns]
    

    Чтобы просмотреть первые N строк DataFrame, используйте метод head() с требуемым количеством строк (в данном случае 8) в качестве аргумента.

Примечание

Интересуют последние N строк, а не первые? Используйте метод tail(). Например, titanic.tail(10) вернет последние 10 строк DataFrame.

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

In [5]: titanic.dtypes
Out[5]: 
PassengerId      int64
Survived         int64
Pclass           int64
Name            object
Sex             object
Age            float64
SibSp            int64
Parch            int64
Ticket          object
Fare           float64
Cabin           object
Embarked        object
dtype: object

Для каждого столбца указывается используемый тип данных. Типы данных в этом DataFrame: целые числа (int64), числа с плавающей запятой (float64) и строки (object).

Примечание

При запросе dtypes скобки не используются! dtypes является атрибутом DataFrame и Series. Атрибуты DataFrame или Series не нуждаются в скобках. Атрибуты представляют собой характеристику DataFrame и Series, тогда как метод (который требует скобок) делает что-то с DataFrame или Series, как представлено в первом уроке.

  • Мой коллега запросил данные Титаника в виде электронной таблицы.

    In [6]: titanic.to_excel("titanic.xlsx", sheet_name="passengers", index=False)
    

    В то время как функции read_* используются для чтения данных в pandas, методы to_* используются для хранения данных. Метод to_excel() сохраняет данные в виде файла Excel. В приведенном здесь примере sheet_name имеет значение passengers, а не предусмотренное по умолчанию Sheet1. При установке index=False в электронной таблице не сохраняются метки индексов строк.

Эквивалентная функция чтения read_excel() перезагрузит данные в DataFrame:

In [7]: titanic = pd.read_excel("titanic.xlsx", sheet_name="passengers")
In [8]: titanic.head()
Out[8]: 
   PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
0            1         0       3  ...   7.2500   NaN         S
1            2         1       1  ...  71.2833   C85         C
2            3         1       3  ...   7.9250   NaN         S
3            4         1       1  ...  53.1000  C123         S
4            5         0       3  ...   8.0500   NaN         S

[5 rows x 12 columns]
  • Меня интересует техническая сводка DataFrame

    In [9]: titanic.info()
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 891 entries, 0 to 890
    Data columns (total 12 columns):
     #   Column       Non-Null Count  Dtype  
    ---  ------       --------------  -----  
     0   PassengerId  891 non-null    int64  
     1   Survived     891 non-null    int64  
     2   Pclass       891 non-null    int64  
     3   Name         891 non-null    object 
     4   Sex          891 non-null    object 
     5   Age          714 non-null    float64
     6   SibSp        891 non-null    int64  
     7   Parch        891 non-null    int64  
     8   Ticket       891 non-null    object 
     9   Fare         891 non-null    float64
     10  Cabin        204 non-null    object 
     11  Embarked     889 non-null    object 
    dtypes: float64(2), int64(5), object(5)
    memory usage: 83.7+ KB
    

    Метод info() предоставляет техническую информацию о DataFrame, так что давайте объясним результаты более подробно:

    • Это действительно DataFrame.

    • Имеется 891 запись, то есть 891 строка.

    • Каждая строка имеет метку строки (index) со значениями в диапазоне от 0 до 890.

    • В таблице 12 столбцов. Большинство столбцов имеют значения в каждой из строк (все 891 значения не non-null). В некоторых столбцах значения отсутствуют, количество non-null менее 891.

    • Столбцы Name, Sex, Cabin и Embarked состоят из текстовых данных (строки, или object). Другие столбцы представляют собой числовые данные, некоторые из них представляют собой целые числа (integer), некоторые — вещественные числа (float).

    • Типы данных (символы, целые числа и так далее) в разных столбцах суммируются путем перечисления dtypes.

    • Также указывается приблизительный объем оперативной памяти, используемой для хранения DataFrame.

ЗАПОМНИТЕ

  • Получение данных в pandas из файлов разных форматов или источников данных поддерживается функциями read_*.

  • Экспорт данных из pandas осуществляется разными методами to_*.

  • Методы head/tail/info и атрибут dtypes удобны для первой проверки.

В руководстве пользователя

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