Как сгруппировать и выполнить пользовательский расчет - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть кадр данных - df, как показано ниже:

Stud_id card    Nation  Gender  Age  Code   Amount  yearmonth
111     1       India   M      Adult 543    100     201601
111     1       India   M      Adult 543    100     201601
111     1       India   M      Adult 543    150     201602
111     1       India   M      Adult 612    100     201602
111     1       India   M      Adult 715    200     201603
222     2       India   M      Adult 715    200     201601
222     2       India   M      Adult 543    100     201604
222     2       India   M      Adult 543    100     201603
333     3       India   M      Adult 543    100     201601
333     3       India   M      Adult 543    100     201601
333     4       India   M      Adult 543    150     201602
333     4       India   M      Adult 612    100     201607

Теперь я хочу два кадра данных, как показано ниже:

df_1:

card    Code    Total_Amount    Avg_Amount
1       543     350             175
2       543     200             100
3       543     200             200
4       543     150             150
1       612     100             100
4       612     100             100
1       715     200             200
2       715     200             200

Логика для df_1:

  1. Total_Amount: для каждого уникального card и уникального Code получить сумму суммы (например: card: 1, Code: 543 = 350)
  2. Avg_Amount: разделите общую сумму на число уникальных yearmonth для каждого уникального card и уникального Code (например, Total_Amount = 350, № уникального yearmonth является 2 = 175

df_2:

Code    Avg_Amount
543     156.25
612     100
715     200

Логика для df_2:

  1. Avg_Amount: сумма Avg_Amount каждого Code в df_1 (Например, Code: 543 Сумма Avg_Amount равна 175+100+200+150 = 625. Разделите ее на число строк - 4Так что 625/4 = 156.25

1 Ответ

0 голосов
/ 12 февраля 2019
df1 = df.groupby(['card','Code'])['yearmonth','Amount'].apply(lambda x: [sum(x.Amount),sum(x.Amount)/len(set(x.yearmonth))]).apply(pd.Series).reset_index()

df1.columns= ['card','Code','Total_Amount','Avg_Amount']

Выход

   card  Code  Total_Amount  Avg_Amount
0     1   543           350       175.0
1     1   612           100       100.0
2     1   715           200       200.0
3     2   543           200       100.0
4     2   715           200       200.0
5     3   543           200       200.0
6     4   543           150       150.0
7     4   612           100       100.0

Для второго

df2 = df1.groupby('Code')['Avg_Amount'].apply(lambda x: sum(x)/len(x)).reset_index(name='Avg_Amount')

Выход

   Code  Avg_Amount
0   543      156.25
1   612      100.00
2   715      200.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...