У меня есть фрейм данных Pandas, который выглядит так
Race_ID Date Student_ID Rank
1 1/1/2023 1 3
1 1/1/2023 2 8
1 1/1/2023 3 0
1 1/1/2023 4 4
2 11/9/2022 1 2
2 11/9/2022 2 3
2 11/9/2022 3 9
3 17/4/2022 5 0
3 17/4/2022 2 1
3 17/4/2022 3 2
3 17/4/2022 4 5
4 1/3/2022 1 6
4 1/3/2022 2 2
5 1/1/2021 1 0
5 1/1/2021 2 3
5 1/1/2021 3 1
И я хочу добавить новый столбец min>0, минимальное значение которого Rank группируется на Race_ID больше 0, поэтому желаемый результат выглядит так:
Race_ID Date Student_ID Rank min>0
1 1/1/2023 1 3 3
1 1/1/2023 2 8 3
1 1/1/2023 3 0 3
1 1/1/2023 4 4 3
2 11/9/2022 1 2 2
2 11/9/2022 2 3 2
2 11/9/2022 3 9 2
3 17/4/2022 5 0 1
3 17/4/2022 2 1 1
3 17/4/2022 3 2 1
3 17/4/2022 4 5 1
4 1/3/2022 1 6 2
4 1/3/2022 2 2 2
5 1/1/2021 1 0 1
5 1/1/2021 2 3 1
5 1/1/2021 3 1 1
Я знаю groupby и transform('min'), но не знаю, как включить условие >0.






Отфильтруйте/замаскируйте значения и вычислите минимум, исключая нежелательные значения.
У вас есть несколько вариантов.
Предварительная маска, а затем использование groupby.transform:
df['min>0'] = (df['Rank'].where(df['Rank']>0)
.groupby(df['Race_ID']).transform('min')
.convert_dtypes()
)
Использование пользовательской функции transform:
df['min>0'] = (df.groupby('Race_ID')['Rank']
.transform(lambda x: x[x>0].min())
)
Или с помощью фильтра, агрегации, а затем карты для возврата к исходной форме:
df['min>0'] = df['Race_ID'].map(df[df['Rank'].gt(0)]
.groupby('Race_ID')['Rank'].min())
Выход:
Race_ID Date Student_ID Rank min>0
0 1 1/1/2023 1 3 3
1 1 1/1/2023 2 8 3
2 1 1/1/2023 3 0 3
3 1 1/1/2023 4 4 3
4 2 11/9/2022 1 2 2
5 2 11/9/2022 2 3 2
6 2 11/9/2022 3 9 2
7 3 17/4/2022 5 0 1
8 3 17/4/2022 2 1 1
9 3 17/4/2022 3 2 1
10 3 17/4/2022 4 5 1
11 4 1/3/2022 1 6 2
12 4 1/3/2022 2 2 2
13 5 1/1/2021 1 0 1
14 5 1/1/2021 2 3 1
15 5 1/1/2021 3 1 1