Сумма значений по сгруппированным столбцам - PullRequest
0 голосов
/ 17 июня 2020

Я был очень близок к тому, чтобы выяснить, как отсортировать мой фрейм данных так, как я хочу, я просто не знаю, есть ли более чистый способ сделать это.

Скажем, мои данные фрейм определяется как-

dic = {'firstname':['John','John','John','John','John','Susan','Susan',
                    'Susan','Susan','Susan','Mike','Mike','Mike','Mike',
                    'Mike'],
       'lastname':['Smith','Smith','Smith','Smith','Smith','Wilson',
                   'Wilson','Wilson','Wilson','Wilson','Jones','Jones',
                   'Jones','Jones','Jones'],
       'company':['KFC','BK','KFC','KFC','KFC','BK','BK','WND','WND',
                  'WND','TB','CHP','TB','CHP','TB'],
       'paid':[200,300,250,100,900,650,430,218,946,789,305,750,140,860,310],
       'overtime':[205,554,840,100,203,640,978,451,356,779,650,950,230,250,980]}
df = pd.DataFrame(dic)
print(df)

с выходом-

   firstname lastname company  paid  overtime
0       John    Smith     KFC   200       205
1       John    Smith      BK   300       554
2       John    Smith     KFC   250       840
3       John    Smith     KFC   100       100
4       John    Smith     KFC   900       203
5      Susan   Wilson      BK   650       640
6      Susan   Wilson      BK   430       978
7      Susan   Wilson     WND   218       451
8      Susan   Wilson     WND   946       356
9      Susan   Wilson     WND   789       779
10      Mike    Jones      TB   305       650
11      Mike    Jones     CHP   750       950
12      Mike    Jones      TB   140       230
13      Mike    Jones     CHP   860       250
14      Mike    Jones      TB   310       980

моя цель - выяснить, зарабатывает ли кто-то больше 1300 в компании без учета сверхурочных (так что только оплачиваемый столбец)

это то, что я пытался -

df = df.groupby(['lastname', 'firstname','company']).sum()
s = df['paid']>1300
df['limit']=s
df = df.loc[df['limit']==True]
del df['limit']
df = df.sort_values(by=['paid'],ascending=False)
print(df)

с выходным результатом -

                            paid  overtime
lastname firstname company                
Wilson   Susan     WND      1953      1586
Jones    Mike      CHP      1610      1200
Smith    John      KFC      1450      1348

Я ищу помощь, чтобы потенциально очистить мою работу, но также с несколькими вопросами.

Почему столбец вывода для оплачиваемой и сверхурочной работы увеличен? Могу я вернуть это назад? Кроме того, я хочу суммировать только оплаченный столбец и ничего больше (это нормально, если столбец сверхурочных не появляется в окончательном выводе)

Это больше, что я ищу -

lastname firstname company paid              
Wilson   Susan     WND     1953
Jones    Mike      CHP     1610
Smith    John      KFC     1450

1 Ответ

1 голос
/ 17 июня 2020

Измените эту строку, используйте as_index=False и agg:

df = df.groupby(['lastname', 'firstname','company'], as_index=False).agg({'paid': 'sum'})

  lastname firstname company  paid
5   Wilson     Susan     WND  1953
0    Jones      Mike     CHP  1610
3    Smith      John     KFC  1450
...