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.

+1
5
+1
0
+1
0
+1
1
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *