Pandas: Манипуляции с табличными данными и их загрузка
Добро пожаловать в мир Pandas — библиотеки, которая станет вашим незаменимым помощником в работе с данными! Если NumPy был фундаментом для числовых вычислений, то Pandas — это мощный инструмент для работы с табличными данными, который значительно упрощает их загрузку, очистку, трансформацию и анализ.
В машинном обучении подавляющее большинство задач начинается с данных, представленных в табличном виде (как в Excel или базах данных). Pandas предоставляет интуитивно понятные структуры данных и функции, которые позволяют эффективно манипулировать этими таблицами, подготавливая их к дальнейшему анализу и построению моделей.
В этом разделе мы научимся загружать данные из различных источников, а также освоим базовые операции по их просмотру и изменению.
Основные Концепции: Series и DataFrame
Pandas вводит две ключевые структуры данных: Series и DataFrame. Они построены на основе массивов NumPy, но добавляют к ним метки (индексы), что делает работу с данными гораздо более удобной и интуитивной.
Series: Одномерные Данные с Метками
Series можно представить как одномерный массив (вектор) с метками (индексами). Это похоже на столбец в электронной таблице или словарь в Python, где ключи становятся индексами.
import pandas as pd
import numpy as np
# Создание Series из списка
s = pd.Series([10, 20, 30, 40, 50])
print("Series из списка:\n", s)
# Series с пользовательскими индексами
s_indexed = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print("\nSeries с индексами:\n", s_indexed)
# Series из словаря (ключи становятся индексами)
data_dict = {'Москва': 13_000_000, 'Санкт-Петербург': 5_600_000, 'Новосибирск': 1_600_000}
population = pd.Series(data_dict)
print("\nSeries из словаря (население городов):\n", population)
# Доступ к элементам Series
print("\nНаселение Москвы:", population['Москва'])
print("Население Новосибирска (по индексу):", population[2])
DataFrame: Табличные Данные с Метками
DataFrame — это основная структура данных в Pandas, представляющая собой двумерную таблицу с метками строк (индексами) и столбцов. Это очень похоже на электронную таблицу, таблицу в SQL-базе данных или словарь из объектов Series.
Каждый столбец DataFrame — это объект Series.
# Создание DataFrame из словаря списков
data = {
'Имя': ['Анна', 'Борис', 'Вера', 'Глеб'],
'Возраст': [25, 30, 22, 35],
'Город': ['Москва', 'Санкт-Петербург', 'Казань', 'Москва']
}
df = pd.DataFrame(data)
print("DataFrame из словаря списков:\n", df)
# Создание DataFrame из списка словарей
data_list_of_dicts = [
{'Имя': 'Дарья', 'Возраст': 28, 'Город': 'Екатеринбург'},
{'Имя': 'Егор', 'Возраст': 32, 'Город': 'Сочи'}
]
df_from_list = pd.DataFrame(data_list_of_dicts)
print("\nDataFrame из списка словарей:\n", df_from_list)
# Доступ к столбцу DataFrame (возвращает Series)
print("\nСтолбец 'Возраст':\n", df['Возраст'])
# Доступ к нескольким столбцам (возвращает DataFrame)
print("\nСтолбцы 'Имя' и 'Город':\n", df[['Имя', 'Город']])
Важно: Понимание разницы между
SeriesиDataFrame— ключ к эффективной работе с Pandas.Series— это один столбец,DataFrame— это набор столбцов (Series), объединенных общим индексом.
Загрузка Данных
Одной из самых частых операций в машинном обучении является загрузка данных из файлов. Pandas поддерживает множество форматов, но наиболее распространенными являются CSV (Comma Separated Values) и Excel.
Загрузка CSV-файлов
CSV-файлы — это текстовые файлы, где значения разделены запятыми (или другими разделителями). Это самый популярный формат для обмена табличными данными. Для загрузки используется функция pd.read_csv().
Представим, что у нас есть файл users.csv со следующим содержимым:
id,name,age,city
1,Иван,28,Москва
2,Мария,34,Санкт-Петербург
3,Петр,22,Новосибирск
4,Елена,45,Казань
# Для примера создадим файл users.csv
# В реальной ситуации вы бы просто загрузили существующий файл
with open('users.csv', 'w', encoding='utf-8') as f:
f.write("id,name,age,city\n")
f.write("1,Иван,28,Москва\n")
f.write("2,Мария,34,Санкт-Петербург\n")
f.write("3,Петр,22,Новосибирск\n")
f.write("4,Елена,45,Казань\n")
# Загрузка данных из CSV-файла
df_users = pd.read_csv('users.csv')
print("Загруженный DataFrame из users.csv:\n", df_users)
# Можно указать другой разделитель, если это не запятая (например, точка с запятой)
# df_semicolon = pd.read_csv('data.txt', sep=';')
# Загрузка без заголовков (если первая строка не содержит названия столбцов)
# df_no_header = pd.read_csv('data.csv', header=None)
Другие Форматы
Pandas также умеет загружать данные из:
- Excel:
pd.read_excel('file.xlsx') - JSON:
pd.read_json('file.json') - SQL-баз данных:
pd.read_sql_table(),pd.read_sql_query()(требует установки соответствующих драйверов)
Базовые Манипуляции с Данными
После загрузки данных вам потребуется их исследовать и манипулировать ими.
Просмотр Данных
# Посмотрим на первые 3 строки
print("Первые 3 строки:\n", df_users.head(3))
# Посмотрим на последние 2 строки
print("\nПоследние 2 строки:\n", df_users.tail(2))
# Общая информация о DataFrame (типы данных, количество непустых значений)
print("\nИнформация о DataFrame:")
df_users.info()
# Статистическое описание числовых столбцов
print("\nСтатистическое описание:\n", df_users.describe())
# Размеры DataFrame (строки, столбцы)
print("\nРазмер DataFrame (строки, столбцы):", df_users.shape)
# Названия столбцов
print("Названия столбцов:", df_users.columns)
Выборка Данных (Индексация)
Вы можете выбирать данные по столбцам, строкам или по их комбинации.
Выборка Столбцов
# Выбор одного столбца (возвращает Series)
ages = df_users['age']
print("\nСтолбец 'age':\n", ages)
# Выбор нескольких столбцов (возвращает DataFrame)
names_cities = df_users[['name', 'city']]
print("\nСтолбцы 'name' и 'city':\n", names_cities)
Выборка Строк по Индексу или Метке (.loc и .iloc)
.loc(location) используется для выборки строк и столбцов по меткам (названиям)..iloc(integer location) используется для выборки строк и столбцов по целочисленным позициям (как в NumPy массивах).
# Выбор строки по метке индекса (по умолчанию это числа 0, 1, 2...)
print("\nСтрока с индексом 1 (используя .loc):\n", df_users.loc[1])
# Выбор строк с индексами от 0 до 2 (включая 2)
print("\nСтроки с индексами от 0 до 2 (используя .loc):\n", df_users.loc[0:2])
# Выбор строки по целочисленной позиции (как в списках Python)
print("\nСтрока с позицией 1 (используя .iloc):\n", df_users.iloc[1])
# Выбор строк с позициями от 0 до 2 (не включая 2)
print("\nСтроки с позициями от 0 до 2 (используя .iloc):\n", df_users.iloc[0:2])
# Выбор конкретной ячейки: строка с индексом 0, столбец 'name'
print("\nИмя пользователя с индексом 0 (loc):", df_users.loc[0, 'name'])
print("Имя пользователя с позицией 0, столбец с позицией 1 (iloc):", df_users.iloc[0, 1])
Запомните:
.locработает с именами индексов/столбцов,.iloc— с числовыми позициями. Это одно из самых частых мест для ошибок у новичков!
Фильтрация Данных по Условию
Это мощный способ выбрать строки, которые соответствуют определенным критериям.
# Выбор пользователей старше 30 лет
older_users = df_users[df_users['age'] > 30]
print("\nПользователи старше 30 лет:\n", older_users)
# Выбор пользователей из Москвы
moscow_users = df_users[df_users['city'] == 'Москва']
print("\nПользователи из Москвы:\n", moscow_users)
# Комбинированные условия (используйте & для И, | для ИЛИ)
young_moscow_users = df_users[(df_users['age'] < 30) & (df_users['city'] == 'Москва')]
print("\nМолодые пользователи из Москвы:\n", young_moscow_users)
# Выбор пользователей из списка городов
selected_cities = ['Москва', 'Казань']
users_from_selected_cities = df_users[df_users['city'].isin(selected_cities)]
print("\nПользователи из Москвы или Казани:\n", users_from_selected_cities)
Создание и Изменение Столбцов
# Добавление нового столбца
df_users['is_adult'] = df_users['age'] >= 18
print("\nDataFrame с новым столбцом 'is_adult':\n", df_users)
# Изменение значений в существующем столбце
df_users['age'] = df_users['age'] + 1 # Увеличим возраст всех на 1
print("\nDataFrame с измененным возрастом:\n", df_users)
# Создание столбца на основе других столбцов
df_users['name_city'] = df_users['name'] + ' из ' + df_users['city']
print("\nDataFrame с новым столбцом 'name_city':\n", df_users)
Удаление Столбцов и Строк
# Удаление столбца 'is_adult' (original DataFrame не меняется, если не указать inplace=True)
df_users_no_adult = df_users.drop('is_adult', axis=1) # axis=1 означает столбец
print("\nDataFrame без столбца 'is_adult':\n", df_users_no_adult)
# Удаление нескольких столбцов
df_users_slim = df_users.drop(['name_city', 'id'], axis=1)
print("\nDataFrame без столбцов 'name_city' и 'id':\n", df_users_slim)
# Удаление строк по индексу (например, строка с индексом 0)
df_users_no_first_row = df_users.drop(0, axis=0) # axis=0 означает строку
print("\nDataFrame без первой строки:\n", df_users_no_first_row)
# Удаление нескольких строк
df_users_filtered_rows = df_users.drop([1, 3], axis=0)
print("\nDataFrame без строк с индексами 1 и 3:\n", df_users_filtered_rows)
Совет: Используйте
inplace=Trueв методахdrop,renameи других, если хотите изменить DataFrame напрямую, без создания новой копии. Однако будьте осторожны, так как это необратимо! Чаще всего лучше создавать новую копию.
Задания для Самостоятельной Работы
Пришло время закрепить полученные знания на практике!
Упражнения
- Создание и загрузка:
- Создайте DataFrame
products_dfсо следующими столбцами:Название,Категория,Цена,Наличие_на_складе. Заполните его 5-7 строками данных о товарах (например, "Ноутбук", "Электроника", 75000, True). - Представьте, что у вас есть файл
sales.csvс данными о продажах. Создайте этот файл программно (как мы делали сusers.csv) со столбцамиДата,Товар_ID,Количество,Сумма. Добавьте несколько строк. - Загрузите
sales.csvв DataFramesales_df.
- Создайте DataFrame
- Исследование данных:
- Выведите первые 3 строки
sales_df. - Получите общую информацию о
sales_df(используяinfo()). - Выведите статистическое описание для числовых столбцов
products_df.
- Выведите первые 3 строки
- Манипуляции с данными:
- Выберите из
products_dfтолько товары категории "Электроника". - Найдите все продажи из
sales_df, гдеКоличествобольше 5. - Добавьте в
products_dfновый столбецЦена_со_скидкой, который будет равенЦенаминус 10%. - Удалите столбец
Наличие_на_складеизproducts_df(создайте новый DataFrame без этого столбца).
- Выберите из
Вопросы для Самопроверки
- В чем основное отличие между
SeriesиDataFrameв Pandas? - Для чего используются методы
.locи.iloc? Приведите пример ситуации, когда вы бы использовали каждый из них. - Какая функция Pandas используется для загрузки данных из CSV-файла?
- Как выбрать несколько столбцов из DataFrame?
- Как отфильтровать DataFrame, чтобы получить только строки, удовлетворяющие определенному условию?
Ключевые Выводы и Следующие Шаги
Сегодня мы сделали большой шаг в освоении работы с данными, изучив библиотеку Pandas. Вы научились:
- Понимать основные структуры данных Pandas:
SeriesиDataFrame. - Загружать табличные данные из CSV-файлов.
- Просматривать базовую информацию о DataFrame (
head,info,describe,shape). - Выбирать данные по столбцам, а также по меткам (
.loc) и позициям (.iloc) строк. - Фильтровать данные по условиям.
- Создавать, изменять и удалять столбцы и строки.
Эти навыки — фундамент для любого проекта машинного обучения. Практически каждый ML-проект начинается с этапа подготовки данных, и Pandas будет вашим основным инструментом на этом пути.
Далее мы перейдем к фундаментальным концепциям машинного обучения. Вы узнаете, какие бывают задачи в ML, такие как классификация и регрессия, и как они формулируются. Понимание того, как данные, которые вы научились обрабатывать с помощью Pandas, будут использоваться для решения этих задач, откроет вам двери в мир создания собственных ИИ-проектов!