Сохранение значений фрейма данных на основе суммированного столбца - PullRequest
1 голос
/ 18 июня 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'], as_index=False).agg({'paid':'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).reset_index()
del df['index']
print(df)

с выходом-

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

То, что я хочу сделать сейчас, относительно похоже, но я больше не хочу суммировать значения, я просто хочу сохранить исходную информацию из строки, сумма которых в сумме превышает 1300 на основе столбца «оплачено».

Желаемый результат -

   firstname lastname company  paid  overtime
0       John    Smith     KFC   200       205
1       John    Smith     KFC   250       840
2       John    Smith     KFC   100       100
3       John    Smith     KFC   900       203
4      Susan   Wilson     WND   218       451
5      Susan   Wilson     WND   946       356
6      Susan   Wilson     WND   789       779
7       Mike    Jones     CHP   750       950
8       Mike    Jones     CHP   860       250

1 Ответ

0 голосов
/ 18 июня 2020

Это довольно простое однострочное изменение. Вместо agg сделайте transform:

df = df.groupby(['lastname', 'firstname','company'], as_index=False).transform(sum)
And then,
df[df.groupby(['lastname', 'firstname','company'])['paid'].transform('sum') > 1350]

edit: Спасибо Датановице за то, что он указал, что я должен сделать это полным ответом и написать последнюю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...