Pandas groupby преобразует минимум больше 0

У меня есть фрейм данных 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.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отфильтруйте/замаскируйте значения и вычислите минимум, исключая нежелательные значения.

У вас есть несколько вариантов.

Предварительная маска, а затем использование 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

Другие вопросы по теме