← На главную Воспоминания

Среда, 27 Декабря 2023

Прошел пару уроков по pandas

Creating, Reading and Writing

Импортируется пандас так

import pandas as pd

В пандасе есть две сущности: DataFrame и Series. Датафрейм - эта таблица, такая как в экселе, Сириес - это массив, такой как лист в питоне, только немного улучшенный

DataFrame

Чтобы создать датафрейм, можно использовать конструктор pd.DataFrame()

pd.DataFrame({
    'Yes': [50, 21],
    'No': [131, 2]
})

Синтаксис следующий, словарь с ключами-столбцами, и значениями - строками в таблице это эквивалентно такой таблице

Yes No
0 50 131
1 21 2

В качетсве значений в таблице могут быть не только цифры, но и строки.

Левый столбец с индексом строки тоже можно поменять, установив index

pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 
              'Sue': ['Pretty good.', 'Bland.']},
             index=['Product A', 'Product B'])

Series

чтобы создать сериес можно использовать следующий конструктор

pd.Series([1, 2, 3, 4, 5])

в сериес также возможно установить значение индексного столбца и имя для всей сириес

pd.Series([30, 35, 40], index=['2015 Sales', '2016 Sales', '2017 Sales'], name='Product A')

аутпут будет следуюший

2015 Sales    30
2016 Sales    35
2017 Sales    40
Name: Product A, dtype: int64

Чтение csv

dataframe_with_data = pd.read_csv("путь/файл.csv")

также возможно установить какую колонку использовать в качестве индексной

wine_reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)

в данной примере колонка номер 0

Сохранение в csv

представим что у нас есть датафрейм с названием df

df.to_csv(file_name, encoding='utf-8', index=False)

Чтение датафрейма

Можно использовать . синтаксис или квадратные скобки, например

reviews.country
reviews['country']
reviews['country'][0] # чтобы выбрать первую строку столбца country

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

используется loc и iloc. iloc отличается тем что используются индексы

reviews.iloc[0] # выберет первую строку и все столбцы

параметры задаются следующим образом: сначала строки, потом столбцы

iloc

reviews.iloc[:, 0] # все строки первого столбца
reviews.iloc[:3, 0] # первые три строки первого столбца
reviews.iloc[1:3, 0] # вторая и третья строка первого столбца
reviews.iloc[[0, 1, 2], 0] # первая, вторая и третья строка первого столбца
reviews.iloc[-5:] # последние пять строк все столбцы

loc

reviews.loc[0, 'country'] # столбец country, первая строка
reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']] # все строки столбцов taster_name, taster_twitter_handle, points

можно указывать какой столбец это индекс этого датафрейма, то есть какой столбец хранит в себе знвчение уникально определяющие это строку, например айди строки или тайтл

reviews.set_index("title")

Выборка по условию

reviews.country == 'Italy'

вернет сириес с тру/фолс, такого же размера что и датафрейм, если страна италия то тру, если нет то фолс

reviews.loc[reviews.country == 'Italy'] # Вернет только там где страна италия
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)] # Вернет только там где страна италия и количество балов больше 90
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)] # Вернет только там где страна италия или количество балов больше 90
reviews.loc[reviews.country.isin(['Italy', 'France'])] # вернет там где страна Франция или Италия
reviews.loc[reviews.price.notnull()] # вернет там где цена задана, не нал

Запись в датафрейм

reviews['critic'] = 'everyone' # во все строки запишется значение everyone в столбце critic
reviews['index_backwards'] = range(len(reviews), 0, -1) # запишится индекс задом наперед

Переименование колонок

reviews.rename(columns={'points': 'score'})
reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'}) # переименование индексной колонки
reviews.rename_axis("wines", axis='rows').rename_axis("fields", axis='columns') # переименование колонки или столбца

Обьединение датафреймов

concat

canadian_youtube = pd.read_csv("../input/youtube-new/CAvideos.csv")
british_youtube = pd.read_csv("../input/youtube-new/GBvideos.csv")

pd.concat([canadian_youtube, british_youtube])

join

left = canadian_youtube.set_index(['title', 'trending_date'])
right = british_youtube.set_index(['title', 'trending_date'])

left.join(right, lsuffix='_CAN', rsuffix='_UK')

Самари функции

reviews.points.describe()
reviews.taster_name.describe() # для строк выведет другую статистику
reviews.points.mean()
reviews.taster_name.unique()
reviews.taster_name.value_counts()

Мапы

Изменить значения в датафрейме, применив какую либо функцию к ним

review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)

join делает тоже самое, но можно применять ко всему датафрейму

def remean_points(row):
    row.points = row.points - review_points_mean
    return row

reviews.apply(remean_points, axis='columns')

Базовые операции можно применять без мап и джоин

review_points_mean = reviews.points.mean()
reviews.points - review_points_mean

На этом все что я прошел по пандас сегодня. Написал статью как можно применять большие языковые модели для помощи в программировании