7 Простых советов, которые сделают вас профессионалом в использовании Pandas
Pandas – одна из самых популярных и широко используемых библиотек для анализа данных на Python. Её мощь и универсальность делают её незаменимым инструментом для всех, кто работает с данными. Независимо от того, являетесь ли вы новичком или опытным пользователем, всегда есть возможности для совершенствования ваших навыков работы с Pandas. Вот несколько советов, которые помогут вам поднять свои навыки владения Pandas на новый уровень.
1. Используйте Chaining: Chaining – это мощная функция в Pandas, которая позволяет выполнять несколько операций в одной строке кода. Она не только делает ваш код более кратким и читабельным, но и повышает его производительность за счёт уменьшения количества создаваемых промежуточных объектов.
import pandas as pd
import numpy as np
# pd.set_option('display.max_rows', None)
# pd.set_option('display.max_columns', None)
# pd.set_option('display.width', 1000)
df = pd.read_csv("datasets/netflix-tv-shows-and-movies.csv")
df.head()
df_updated = (df
.query("release_year>2018") # Get movies and shows only released after 2018
.loc[:, ["title", "release_year", "duration"]] # Get only these
.assign(over_three_hours=lambda dataframe: np.where(dataframe["duration"] > 180, "Yes", "No")) # Create new column called over_three_hours depending on duration > 180
.groupby(by=["release_year", "over_three_hours"]) # Group by given columns
.count() # Get count of movies by release_year and over_three_hours
)
df_updated
########## RESULT ##########
title duration
release_year over_three_hours
2019 No 995 995
Yes 1 1
2020 No 867 867
Yes 1 1
2021 No 31 31
Вы видите! Это так же просто прочитать и понять, как мы получаем df_updated
.
2. nlargest
и nsmallest
: Вместо использования sort_values
для поиска наибольших или наименьших значений в ваших данных рассмотрите возможность использования nlargest
и nsmallest
. Эти функции работают быстрее и более эффективно используют память, что делает их отличным выбором для больших наборов данных.
import pandas as pd
import numpy as np
import seaborn as sns
df = sns.load_dataset("titanic")
df.nsmallest(3, "age") # Youngest 3 passengers
df.nlargest(3, "age") # Oldest 3 passengers
########## nsmallest ##########
survived pclass sex age ... deck embark_town alive alone
803 1 3 male 0.42 ... NaN Cherbourg yes False
755 1 2 male 0.67 ... NaN Southampton yes False
469 1 3 female 0.75 ... NaN Cherbourg yes False
########## nlargest ##########
survived pclass sex age ... deck embark_town alive alone
630 1 1 male 80.0 ... A Southampton yes True
851 0 3 male 74.0 ... NaN Southampton no True
96 0 1 male 71.0 ... A Cherbourg no True
3. Фильтрация данных с помощью метода .query()
: Pandas функция query
позволяет вам фильтровать ваши данные с помощью логических выражений. Вы также можете использовать символы @
для ссылки на переменные в вашем запросе, что делает его удобным и мощным инструментом для фильтрации данных.
df["embark_town"].unique() # ['Southampton', 'Cherbourg', 'Queenstown', nan]
embark_towns = ["Southampton", "Queenstown"] # Only want to select these towns
df.query("age>21 & fare>250 & embark_town==@embark_towns").head()
########## RESULT ##########
survived pclass sex age ... deck embark_town alive alone
88 1 1 female 23.0 ... C Southampton yes False
341 1 1 female 24.0 ... C Southampton yes False
438 0 1 male 64.0 ... C Southampton no False
[3 rows x 15 columns]
4. Использование метода df.cut
: Функция cut
– это полезный инструмент для разбиения ваших данных на отдельные категории. Это может быть полезно для визуализации ваших данных или для преобразования непрерывных переменных в категориальные.
# Child - 0 to 9 years
# Teen - 10-19 years
# Young - 19 to 24 years
# Adult - 25 to 59
# Elderly > 59
# bins = [-float('inf'), 10, 19, 24, 59, float('inf')]
bins = [0, 10, 19, 24, 59, float('inf')]
labels = ["Child", "Teen", "Young", "Adult", "Elderly"]
df["age"].hist()
plt.show()
df["age_category"] = pd.cut(df["age"], bins=bins, labels=labels)
sorted_df = df.sort_values(by="age_category")
sorted_df["age_category"].hist()
plt.show()
5. Преобразование типов данных для экономии памяти и ускорения: Pandas по умолчанию использует тип данных int128
для целых чисел, но в некоторых случаях может потребоваться преобразовать их в int64, int32...
для экономии памяти. Мы можем проверить минимальное и максимальное значения целых чисел, просто выполнив np.iinfo()
.
np.iinfo("int32") # iinfo(min=-2147483648, max=2147483647, dtype=int32)
np.iinfo("int16") # iinfo(min=-32768, max=32767, dtype=int16)
np.iinfo("int8") # iinfo(min=-128, max=127, dtype=int8)
Это означает, что int16
находится между -237689 и 32768, в то время как int8
находится только между -129 и 128. Таким образом, это означает, что мы можем сэкономить немного памяти, преобразовав некоторые столбцы. Например, в Titanic Dataset мы можем преобразовать survived и pclass в int8
, потому что значения этих столбцов всегда будут находиться в диапазоне от -127 до 127. Давайте создадим образец набора данных, преобразуем некоторые столбцы в int8
и посмотрим на разницу в использовании памяти:
# Creates a dataframe of random generated values
from create_random_data import create_random_data
df = create_random_data(1_000_000) # Create a df with 1M rows
df.head()
# Check the memory usage of the DataFrame before conversion
print("Before Conversion:")
print(df.info(memory_usage='deep')) # memory usage: 84.9 MB
columns_to_convert = ["prob", "previous_races_count", "next_round"]
df[columns_to_convert] = df[columns_to_convert].astype("int8")
df["height", "weight"] = df["height"].astype("int16")
# Check the memory usage of the DataFrame after conversion
print("\nAfter Conversion:")
print(df.info(memory_usage='deep')) # memory usage: 72.5 MB
Мы сэкономили более 10 Мб, преобразовав только 5 столбцов int32
в int8
и int16
.
Представьте, что, преобразовав 10 столбцов int64
в int8
и int16
, мы сэкономили бы не менее 50 Мбайт и ускорили бы наши процессы обработки данных.
6. Избегайте использования inplace
: Параметр inplace
в Pandas позволяет выполнять операции непосредственно с вашим фреймом данных, но его использование может быть опасным, поскольку это может затруднить чтение и отладку вашего кода. Вместо этого попробуйте использовать стандартный метод присвоения результата вашей операции новому объекту:
# using inplace to remove the first row of the DataFrame directly
# DON'T
# df.drop(0, inplace=True)
# DO
df = df.drop(0)
7. Избегайте ненужных функций apply
: Функция apply
может быть мощным инструментом, но она также может быть медленной и отнимать много памяти. Старайтесь избегать использования apply
, когда есть прямые, более быстрые и эффективные способы достижения вашей цели.
columns = ['space_ship', 'galaxy', 'speed',
'maneuverability', 'pilot_skill', 'resource_management']
# Calculate the win probability element-wise for each row using the specified formula
df['win_prob'] = (df['speed'] * df['maneuverability'] * df['pilot_skill']) / df['resource_management']
# ------------------
# Using .apply()
# df['win_prob'] = df.apply(lambda row: (row['speed'] * row['maneuverability'] * row['pilot_skill']) / row['resource_management'], axis=1)
8. БОНУС! Агрегация данных: Нам нужно освоить агрегацию, чтобы получить более глубокое представление о наших данных, суммируя их значимыми способами. Агрегирование позволяет проводить эффективный анализ больших наборов данных, что позволяет нам быстро отвечать на сложные вопросы. Это может помочь нам принимать обоснованные решения на основе полученных данных и добиваться более успешных результатов.
В заключение, эти советы – только начало того, что вы можете сделать, чтобы улучшить свои навыки работы с библиотекой Pandas. Помните, что всегда нужно искать новые знания и техники, а также практиковаться. С помощью этих советов и некоторой кропотливой работы вы, в кратчайшие сроки, станете профессионалом Pandas.