Среда, 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
На этом все что я прошел по пандас сегодня. Написал статью как можно применять большие языковые модели для помощи в программировании