Python Pandas Group c3 найдет макс. Столбца 2 и получит столбец 1

62
8

Я попытался отразить некоторые сложные операции SQL в python. началось с интимного требования, чтобы узнать EMP_ID, который получает максимальную зарплату в отделе. 3 шага:

GroupBy (Отдел)

Макс (зарплата) - в каждом отделе

get (Emp_Id) - в каждом отделе

Пример file.csv

EMP_ID,NAME,AGE,ADDRESS,SAL,DEPT,LOC
1,ghk,3,PTBP,23,IME,bhmd
2,ghk,3,PTBP,23,IME,bhmd
3,ghk,3,PTBP,23,IME,bhmd
4,ghk,3,PTBP,23,IME-DATA,bhmd
5,ghk,3,PTBP,24,IME-DATA,bhmd
6,ghk,3,PTBP,23,IME,bhmd
7,ghk,3,PTBP,23,IME,bhmd
8,ghk,3,PTBP,29,IME-NA,bhmd
9,ghk,3,PTBP,23,IME,bhmd
10,ghk,3,PTBP,23,IME-NA,bhmd

Код, который я пробовал:

import pandas as pd
from pandas import *
import numpy as np
from numpy import *
df=pd.read_csv("SAM_JOINS.csv",sep=",")
go=df["EMP_ID"]+df["AGE"]
df["SYSTEM_REVENUE"]=go
print (df)
b=df.groupby(["DEPT"],as_index=False)
gb1=b['DEPT'].agg({'Count':np.size})
print(gb1)

но не удалось получить максимальную (зарплату) и emp_id каждым делом. Пожалуйста, помогите мне в этом отношении, поскольку я - новая пчела для pandon pandas.

спросил(а) 2021-01-27T23:45:05+03:00 2 месяца, 2 недели назад
1
Решение
62

Вы можете использовать метод group.transform.

В принципе, эта строка:

df['DEPT_MAX_SAL'] = df.groupby('DEPT')['SAL'].transform(lambda x: x.max())

ставит максимальную зарплату отдела на каждую строку, а затем все, что вам нужно сделать, это подмножество оттуда. Я включил IPython реализации с вашими данными. Обратите внимание, что, поскольку ваши данные примера не имеют большого количества изменений в поле SAL, пример не выглядит особенно чистым.

IPython 3.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython features.
%quickref -> Quick reference.
help -> Python own help system.
object? -> Details about 'object', use 'object??' for extra details.
%guiref -> A brief reference about the graphical user interface.

In [1]: from StringIO import StringIO
...: import pandas as pd
...:

In [2]: # Create data set for pandas to read from
...: data = """EMP_ID,NAME,AGE,ADDRESS,SAL,DEPT,LOC
...: 1,ghk,3,PTBP,23,IME,bhmd
...: 2,ghk,3,PTBP,23,IME,bhmd
...: 3,ghk,3,PTBP,23,IME,bhmd
...: 4,ghk,3,PTBP,23,IME-DATA,bhmd
...: 5,ghk,3,PTBP,24,IME-DATA,bhmd
...: 6,ghk,3,PTBP,23,IME,bhmd
...: 7,ghk,3,PTBP,23,IME,bhmd
...: 8,ghk,3,PTBP,29,IME-NA,bhmd
...: 9,ghk,3,PTBP,23,IME,bhmd
...: 10,ghk,3,PTBP,23,IME-NA,bhmd"""
...: data = StringIO(data)
...:

In [3]: # Load dataset
...: df = pd.read_csv(data)
...: print df
...:
EMP_ID NAME AGE ADDRESS SAL DEPT LOC
0 1 ghk 3 PTBP 23 IME bhmd
1 2 ghk 3 PTBP 23 IME bhmd
2 3 ghk 3 PTBP 23 IME bhmd
3 4 ghk 3 PTBP 23 IME-DATA bhmd
4 5 ghk 3 PTBP 24 IME-DATA bhmd
5 6 ghk 3 PTBP 23 IME bhmd
6 7 ghk 3 PTBP 23 IME bhmd
7 8 ghk 3 PTBP 29 IME-NA bhmd
8 9 ghk 3 PTBP 23 IME bhmd
9 10 ghk 3 PTBP 23 IME-NA bhmd

In [4]: # Create new column of department max salary
...: df['DEPT_MAX_SAL'] = df.groupby('DEPT')['SAL'].transform(lambda x: x.max())
...: print df
...:
EMP_ID NAME AGE ADDRESS SAL DEPT LOC DEPT_MAX_SAL
0 1 ghk 3 PTBP 23 IME bhmd 23
1 2 ghk 3 PTBP 23 IME bhmd 23
2 3 ghk 3 PTBP 23 IME bhmd 23
3 4 ghk 3 PTBP 23 IME-DATA bhmd 24
4 5 ghk 3 PTBP 24 IME-DATA bhmd 24
5 6 ghk 3 PTBP 23 IME bhmd 23
6 7 ghk 3 PTBP 23 IME bhmd 23
7 8 ghk 3 PTBP 29 IME-NA bhmd 29
8 9 ghk 3 PTBP 23 IME bhmd 23
9 10 ghk 3 PTBP 23 IME-NA bhmd 29

In [5]: # Subset to show only employees with max salary in department
...: print df[df['SAL'] == df['DEPT_MAX_SAL']]
EMP_ID NAME AGE ADDRESS SAL DEPT LOC DEPT_MAX_SAL
0 1 ghk 3 PTBP 23 IME bhmd 23
1 2 ghk 3 PTBP 23 IME bhmd 23
2 3 ghk 3 PTBP 23 IME bhmd 23
4 5 ghk 3 PTBP 24 IME-DATA bhmd 24
5 6 ghk 3 PTBP 23 IME bhmd 23
6 7 ghk 3 PTBP 23 IME bhmd 23
7 8 ghk 3 PTBP 29 IME-NA bhmd 29
8 9 ghk 3 PTBP 23 IME bhmd 23

ответил(а) 2021-01-27T23:45:05+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема