Pandas — это мощная библиотека Python для обработки и анализа данных. Создание новых столбцов в DataFrame на основе условий — распространенная задача. В этой статье рассматриваются несколько эффективных методов для достижения этого, уделяя приоритетное внимание как ясности, так и производительности. Мы рассмотрим списковые включения, методы NumPy, pandas.DataFrame.apply
и pandas.Series.map()
, сравнив их сильные и слабые стороны.
Содержание
- Списковые включения для условного создания столбцов
- Использование NumPy для оптимизированной условной логики
- Использование
pandas.DataFrame.apply()
для гибкой условной логики - Эффективное сопоставление значений с помощью
pandas.Series.map()
- Сравнение производительности и рекомендации
Списковые включения для условного создания столбцов
Списковые включения предоставляют краткий синтаксис для создания новых столбцов на основе простых условий. Они особенно эффективны для небольших DataFrame. Однако их производительность может снижаться с увеличением размера набора данных.
import pandas as pd
data = {'Sales': [100, 200, 150, 250, 300],
'Region': ['North', 'South', 'North', 'East', 'West']}
df = pd.DataFrame(data)
df['SalesCategory'] = ['High' if sales > 200 else 'Low' for sales in df['Sales']]
print(df)
Использование NumPy для оптимизированной условной логики
NumPy предлагает высоко оптимизированные векторизованные операции, значительно повышая производительность, особенно для больших DataFrame. np.where()
особенно полезен для условных назначений.
import numpy as np
df['SalesCategory_np'] = np.where(df['Sales'] > 200, 'High', 'Low')
print(df)
Использование pandas.DataFrame.apply()
для гибкой условной логики
Метод apply()
предлагает гибкость для более сложной условной логики, применяя функции построчно (axis=1
) или по столбцам (axis=0
). Однако он может быть медленнее, чем NumPy, для очень больших DataFrame, особенно с вычислительно интенсивными функциями.
def categorize_sales(row):
if row['Region'] == 'North' and row['Sales'] > 150:
return 'High North'
elif row['Sales'] > 200:
return 'High'
else:
return 'Low'
df['SalesCategory_apply'] = df.apply(categorize_sales, axis=1)
print(df)
Эффективное сопоставление значений с помощью pandas.Series.map()
Метод map()
идеально подходит для применения сопоставлений из одного набора значений в другой, эффективно создавая категориальные столбцы.
region_mapping = {'North': 'Northern Region', 'South': 'Southern Region', 'East': 'Eastern Region', 'West': 'Western Region'}
df['RegionMapped'] = df['Region'].map(region_mapping)
print(df)
Сравнение производительности и рекомендации
Оптимальный метод зависит от таких факторов, как сложность условия, размер DataFrame и требования к производительности. Для простых условий и меньших наборов данных списковые включения являются лаконичными. Векторизованные операции NumPy обеспечивают значительные преимущества в производительности для больших наборов данных и более сложной логики. apply()
обеспечивает гибкость для сложных построчных или постолбцовых операций, а map()
превосходит в сопоставлении значений. Рекомендуется провести бенчмаркинг на ваших конкретных данных, чтобы определить наиболее эффективный подход.