Сначала я думаю, unique
не очень хорошая идея, используйте здесь. Потому что, если нужно присвоить вывод функции годам, это невозможно.
Также transform
хорошая идея, если нужен новый столбец для DataFrame, а не агрегированный DataFrame.
Я думаю, нужно GroupBy.apply
, также следует упростить функцию с помощью логической маски:
def find_ratio(df):
ratio = (df != 0).mean()
return ratio
print(df.groupby(["Year"])["Min Delay"].apply(find_ratio).reset_index(name='ratio'))
Year ratio
0 2014 0.5
1 2015 1.0
Решение с лямбда-функцией:
print (df.groupby(["Year"])["Min Delay"]
.apply(lambda x: (x != 0).mean())
.reset_index(name='ratio'))
Year ratio
0 2014 0.5
1 2015 1.0
Решение с GroupBy.transform
вернуть новый столбец:
df['ratio'] = df.groupby(["Year"])["Min Delay"].transform(find_ratio)
print (df)
Year Min Delay ratio
0 2014 0 0.5
1 2014 2 0.5
2 2014 0 0.5
3 2014 4 0.5
4 2015 4 0.0
5 2015 4 0.0
6 2015 2 0.0
7 2015 2 0.0