Датафрейми Pandas

Останнє оновлення 2026-03-29 | Редагувати цю сторінку

Огляд

Питання

  • Як я можу виконати статистичний аналіз табличних даних?

Цілі

  • Вибір окремих значень з датафрейму Pandas.
  • Виділення цілих рядків або цілих стовпців з датафрейму.
  • Вибір підмножини рядків і стовпців з датафрейму за одну операцію.
  • Вибір підмножини з датафрейму за єдиним булевим критерієм.

Датафрейми та серії у Pandas


Датафрейм (DataFrame) містить декілька серій (Series); Датафрейм — це спосіб представлення таблиці в Pandas, а серія — це структура даних, яку Pandas використовує для представлення окремого стовпця.

Pandas побудована на основі бібліотеки Numpy, що означає, що більшість методів для масивів Numpy також застосовується до датафреймів та серій у Pandas.

Що робить Pandas таким привабливим? Це потужний інтерфейс для доступу до окремих записів таблиці, належної обробки відсутніх значень та підтримки операцій з датафреймами, подібних до тих, що застосовуються в реляційних базах даних.

Вибір значень


Існує два способи доступу до значення в позиції [i,j] у датафреймі, залежно від того, як інтерпретується i. Пам’ятайте, що датафрейм використовує індекс для ідентифікації рядків таблиці; отже, кожен рядок має позицію в таблиці, а також заголовок рядка (мітку), яка однозначно визначає цей рядок у датафреймі.

Використовуйте DataFrame.iloc[..., ...] для вибору значень за їх позицією


  • Можна вказати позицію значення за допомогою числового індексу аналогічно 2D-версії вибору символів у рядках.

PYTHON

import pandas as pd
data = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
print(data.iloc[0, 0])

ВИХІД

1601.056136

Використовуйте DataFrame.loc[..., ...] для доступу до значень за їхніми мітками.


  • Можна вказати розташування, використовуючи заголовок рядку та/або стовпця.

PYTHON

print(data.loc["Albania", "gdpPercap_1952"])

ВИХІД

1601.056136

Використовуйте лише : замість мітки для позначення всіх стовпців або всіх рядків.


  • Це відповідає звичайному синтаксису зрізів у Python.

PYTHON

print(data.loc["Albania", :])

ВИХІД

gdpPercap_1952    1601.056136
gdpPercap_1957    1942.284244
gdpPercap_1962    2312.888958
gdpPercap_1967    2760.196931
gdpPercap_1972    3313.422188
gdpPercap_1977    3533.003910
gdpPercap_1982    3630.880722
gdpPercap_1987    3738.932735
gdpPercap_1992    2497.437901
gdpPercap_1997    3193.054604
gdpPercap_2002    4604.211737
gdpPercap_2007    5937.029526
Name: Albania, dtype: float64
  • Той самий результат можна отримати, використовуючи data.loc["Albania"] (без вказання другого індексу).

PYTHON

print(data.loc[:, "gdpPercap_1952"])

ВИХІД

country
Albania                    1601.056136
Austria                    6137.076492
Belgium                    8343.105127
⋮ ⋮ ⋮
Switzerland               14734.232750
Turkey                     1969.100980
United Kingdom             9979.508487
Name: gdpPercap_1952, dtype: float64
  • Той самий результат можна отримати, якщо надрукувати data["gdpPercap_1952"]
  • Більш того, той самий результат можна отримати, застосовуючи нотацію data.gdpPercap_1952 (але не рекомендується, оскільки її легко сплутати з позначенням . для використання методів)

Вибирайте кілька стовпців або рядків за допомогою DataFrame.loc та визначеного зрізу.


PYTHON

print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'])

ВИХІД

             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country
Italy           8243.582340    10022.401310    12269.273780
Montenegro      4649.593785     5907.850937     7778.414017
Netherlands    12790.849560    15363.251360    18794.745670
Norway         13450.401510    16361.876470    18965.055510
Poland          5338.752143     6557.152776     8006.506993

У наведеному вище коді ми бачимо, що зріз із використанням loc включає дані на обох вказаних кінцях, на відміну від зрізу із застосуванням iloc, де зріз не включає кінцевий індекс.

Результат зрізу можна використовувати в подальших операціях.


  • Зазвичай зрізи формуються не тільки для друку.
  • Усі статистичні оператори, які працюють зі цілими фреймами даних, так само працюють зі зрізами.
  • Наприклад, обчислення максимальних значень у зрізі.

PYTHON

print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'].max())

ВИХІД

gdpPercap_1962    13450.40151
gdpPercap_1967    16361.87647
gdpPercap_1972    18965.05551
dtype: float64

PYTHON

print(data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972'].min())

ВИХІД

gdpPercap_1962    4649.593785
gdpPercap_1967    5907.850937
gdpPercap_1972    7778.414017
dtype: float64

Використовуйте операції порівняння для вибору даних на основі певного значення.


  • Порівняння здійснюється поелементно.
  • Повертає датафрейм подібної форми, що містить значення True та False.

PYTHON

# Використовуємо частину даних, щоб результат був читабельним
subset = data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972']
print('Subset of data:\n', subset)

# Які значення перевищують 10000 ?
print('\nWhere are values large?\n', subset > 10000)

ВИХІД

Subset of data:
             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country
Italy           8243.582340    10022.401310    12269.273780
Montenegro      4649.593785     5907.850937     7778.414017
Netherlands    12790.849560    15363.251360    18794.745670
Norway         13450.401510    16361.876470    18965.055510
Poland          5338.752143     6557.152776     8006.506993

Where are values large?
            gdpPercap_1962 gdpPercap_1967 gdpPercap_1972
country
Italy                False           True           True
Montenegro           False          False          False
Netherlands           True           True           True
Norway                True           True           True
Poland               False          False          False

Вибір значень або NaN за допомогою булевої маски.


  • Датафрейм, що містить лише булеві значення, іноді називають маскою через спосіб його використання.

PYTHON

mask = subset > 10000
print(subset[mask])

ВИХІД

             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country
Italy                   NaN     10022.40131     12269.27378
Montenegro              NaN             NaN             NaN
Netherlands     12790.84956     15363.25136     18794.74567
Norway          13450.40151     16361.87647     18965.05551
Poland                  NaN             NaN             NaN
  • Результат містить оригінальні значення, коли умова виконується, та NaN (Not a Number - не число) у решті випадків.
  • Це зручно, оскільки операції на кшталт max, min, average автоматично ігнорують значення NaN.

PYTHON

print(subset[subset > 10000].describe())

ВИХІД

       gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
count        2.000000        3.000000        3.000000
mean     13120.625535    13915.843047    16676.358320
std        466.373656     3408.589070     3817.597015
min      12790.849560    10022.401310    12269.273780
25%      12955.737547    12692.826335    15532.009725
50%      13120.625535    15363.251360    18794.745670
75%      13285.513523    15862.563915    18879.900590
max      13450.401510    16361.876470    18965.055510

Group By: групує, застосовує та комбінує