Эта статья является продолжением первой, в которой мы узнали, как создавать фреймы данных и загружать данные в фреймы данных из файлов CSV и Excel.

В сегодняшнем уроке мы узнаем, как выбирать данные из фрейма данных. Давайте загрузим данные об акциях из Yahoo Finance, щелкнув ссылку для загрузки на странице, которая позволит вам загрузить данные в виде файла CSV. Это исторические данные по акциям S&P 500. Я переименовал файл в stocks.csv. Начнем с импорта панд и загрузки данных из CSV-файла. Вы можете скачать файл CVS и блокнот с этим кодом здесь.

import pandas as pd
data=pd.read_csv('stocks.csv')

Давайте посмотрим на столбцы, которые у нас есть в нашем DataFrame.

data.columns

Мы получаем следующий вывод:

Index(['Date', 'Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')

Использование свойства loc:

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

data.loc[3]

Вывод:

Date         2020-01-15
Open            3282.27
High            3298.66
Low             3280.69
Close           3289.29
Adj Close       3289.29
Volume       3716840000
Name: 3, dtype: object

Однако для простоты чтения было бы лучше назначить более разумные метки. Таким образом, в наших данных, поскольку их можно рассматривать как данные временных рядов, мы можем назначить столбцы даты в качестве индекса.

data.index=data['Date']

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

data.loc['2021-01-04']

Вывод:

Date         2021-01-04
Open            3764.61
High            3769.99
Low             3662.71
Close           3700.65
Adj Close       3700.65
Volume       5006680000
Name: 2021-01-04, dtype: object

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

data.loc['2021-01-04', 'Close']

Вывод:

3700.649902

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

print(data.loc['2021-01-04', ['Open', 'Close']])
# Open and close for Janurary 4 and 5.
print(data.loc[['2021-01-04','2021-01-05'], ['Open','Close']])
Open     3764.61
Close    3700.65
Name: 2021-01-04, dtype: object
                   Open        Close
Date                                
2021-01-04  3764.610107  3700.649902
2021-01-05  3698.020020  3726.860107

Теперь, если вы хотите просмотреть определенные столбцы для всего DataFrame, вы можете сделать это следующим образом:

​print(data.loc[:, ['Open','Close']])
Open        Close
0    3281.810059  3265.350098
1    3271.129883  3288.129883
2    3285.350098  3283.149902
3    3282.270020  3289.290039
4    3302.969971  3316.810059
..           ...          ...
247  3764.610107  3700.649902
248  3698.020020  3726.860107
249  3712.199951  3748.139893
250  3764.709961  3803.790039
251  3815.050049  3824.679932
[252 rows x 2 columns]

Использование «iloc»:

iloc позволяет извлекать данные на основе воображаемого числового индекса. Обратите внимание, что числовой индекс является мнимым, что означает, что это фактический столбец индекса. Например, в наших данных столбец «Дата» был назначен индексом. Но с помощью iloc вы можете извлекать данные на основе номеров индексов, начиная с 0. Так, например, если вы хотите получить строку с индексом 0, вы можете сделать это следующим образом:

data.iloc[0]

Вывод:

Date         2020-01-10
Open            3281.81
High            3282.99
Low             3260.86
Close           3265.35
Adj Close       3265.35
Volume       3212970000
Name: 0, dtype: object

Аналогичным образом вы можете использовать iloc для извлечения данных из определенной строки и столбца, предоставляя индексы для обоих. Скажем, мы хотим получить данные из 2-й строки и 3-го столбца.

data.iloc[2,3]

Вывод:

3277.189941

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

print(data.iloc[-1])
Date         2021-01-08
Open            3815.05
High            3826.69
Low              3783.6
Close           3824.68
Adj Close       3824.68
Volume       4764180000
Name: 251, dtype: object

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

data.iloc[::3]

Используя iloc, мы можем фактически установить значение ячеек. Например, в наших данных, скажем, мы хотим установить громкость на 0 для каждой второй строки.

data.iloc[::2,6]=0

Условный выбор данных:

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

high_close=data.Close>data.Close.mean()
data.loc[high_close]

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

condition = data.Close == 3700.649902
data.loc[condition]

Вот и все, ребята. Панды действительно обладают некоторыми сверхспособностями, и эффективная фильтрация данных определенно является одной из них.