У меня есть фрейм данных (df)
a b c
1 2 20
1 2 15
2 4 30
3 2 20
3 2 15
и я хочу распознавать только максимальные значения из столбца c
Я пытался
a = df.loc[df.groupby('b')['c'].idxmax()]
но он удаляет дубликаты, поэтому я получаю
a b c
1 2 20
2 4 30
он удаляет строки 3, потому что они совпадают с строками 1.
Есть ли способ написать код, чтобы не удалять дубликаты?
Вероятно, это не следует называть удаляемым, но это то, что означает «группировка по».
@Cleb, спасибо, что сработало!






Думаю вам понадобится:
df = df[df['c'] == df.groupby('b')['c'].transform('max')]
print (df)
a b c
0 1 2 20
2 2 4 30
3 3 2 20
Разница в измененных данных:
print (df)
a b c
0 1 2 30
1 1 2 30
2 1 2 15
3 2 4 30
4 3 2 20
5 3 2 15
#only 1 max rows per groups a and b
a = df.loc[df.groupby(['a', 'b'])['c'].idxmax()]
print (a)
a b c
0 1 2 30
3 2 4 30
4 3 2 20
#all max rows per groups b
df1 = df[df['c'] == df.groupby('b')['c'].transform('max')]
print (df1)
a b c
0 1 2 30
1 1 2 30
3 2 4 30
#all max rows per groups a and b
df2 = df[df['c'] == df.groupby(['a', 'b'])['c'].transform('max')]
print (df2)
a b c
0 1 2 30
1 1 2 30
3 2 4 30
4 3 2 20
Почему это лучше или чем отличается от того, что написал Клеб?
@NoobProgrammer - Добавлены немного другие данные для разницы.
Я понимаю, но мне нужен первый, так что я проверю ответ Клеба. Но этот обязательно когда-нибудь пригодится. Хорошего дня и спасибо за усилия.
@NoobProgrammer - Нет проблем, и для вас тоже.
Просто примите во внимание столбец a, когда будете делать groupby:
a = df.loc[df.groupby(['a', 'b'])['c'].idxmax()]
a b c
0 1 2 20
2 2 4 30
3 3 2 20
Может использовать
groupby(['a', 'b'])?