В пандах и в большинстве случаев в Python вообще мы хотим избежать зацикливания наших данных , потому что это может быть медленнее, до коэффициентов 1000x. Pandas и numpy предоставляют множество векторизованных решений для большинства наших проблемных случаев. Подробнее об этом здесь
В вашем случае мы можем использовать np.select
, что позволяет нам определять несколько условий и на основе этих условий мы определяем варианты выбора .
Кроме того, мы можем сделать ваш код более элегантным, используя Series.between
с аргументом inclusive=True
.
conditions = [
df['Date'].between('2008-08-30', '2009-05-31', inclusive=True),
df['Date'].between('2009-08-22', '2010-05-16', inclusive=True),
df['Date'].between('2010-08-28', '2011-05-22', inclusive=True)
]
choices = ['08-09', '09-10', '10-11']
df['season'] = np.select(conditions, choices, default='99-99')
Sidenote
Мы также можем переписать вашу первую функцию лучше, удалив две функции lambda
и просто назначив новый столбец с groupby
и transform
, а также приняв дополнительные аргументы: group
& mean_col
def get_mean(df, group, mean_col):
df['mean'] = df.groupby(group)[mean_col].transform('mean')
return df
Пример * ** 1 038 тысяча тридцать семь *
# Example dataframe
df = pd.DataFrame({'Fruit':['Banana', 'Strawberry', 'Apple', 'Banana', 'Apple'],
'Weight':[10, 12, 8, 9, 14]})
Fruit Weight
0 Banana 10
1 Strawberry 12
2 Apple 8
3 Banana 9
4 Apple 14
get_mean(df, 'Fruit', 'Weight')
Fruit Weight mean
0 Banana 10 9.5
1 Strawberry 12 12.0
2 Apple 8 11.0
3 Banana 9 9.5
4 Apple 14 11.0