Применение функции Groupby к нескольким столбцам в python и вычислениям - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь использовать groupby в python, чтобы разделить INPUT_DF на основе двух столбцов ID и DATE(MM/DD/YY), а затем выполнить математическую операцию над сгруппированными строками.

Математическая функция для сгруппированных строк: EXPOSURE * VALUE.Для сгруппированных ID и DATE может быть несколько экспозиций, в этом случае это должно быть SUM(EXPOSURE * VALUE)

INPUT_DF:

ID  PRODUCT EXPOSURE    DATE(MM/DD/YY)  VALUE
STA A   0.5 1/31/03 3
STA A   0.5 8/29/03 4
MP  B   0.6 8/29/03 5
MP  B   0.5 5/31/05 6
ZT  B   0.3 5/31/05 7
ZT  B   0.5 5/31/05 8
STA A   0.6 1/31/03 1
STA A   0.7 8/29/03 2
MP  B   0.8 8/29/03 3
MP  B   0.2 5/31/05 4
ZT  B   0.5 5/31/05 5
ZT  B   0.2 6/31/05 6

OUTPUT_DF:

ID  DATE    FINAL_VALUE
STA 1/31/03 2.1
STA 8/29/03 3.4
MP  8/29/03 5.4
MP  5/31/05 3.8
ZT  5/31/05 8.6
ZT  6/31/05 1.2

КОД:

Я пытался сделать следующее

OUTPUT_DF  = INPUT_DF[['ID','DATE(MM/DD/YY)']].groupby('ID', 'DATE(MM/DD/YY)')['EXPOSURE']*['VALUE'].sum()

Но это дает мне ошибку.Может ли кто-нибудь помочь мне в решении этого.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Рассчитайте столбец sumproduct, прежде чем применить groupby, а затем просто sum:

input_df['FINAL_VALUE'] = input_df['VALUE'] * input_df['EXPOSURE']

output_df = input_df.groupby(['ID', 'DATE(MM/DD/YY)'])['FINAL_VALUE'].sum()

print(output_df)

Это напечатает:

ID   DATE(MM/DD/YY)
MP   5/31/05           3.8
     8/29/03           5.4
STA  1/31/03           2.1
     8/29/03           3.4
ZT   5/31/05           8.6
     6/31/05           1.2
0 голосов
/ 24 мая 2018

Вот один из способов:

OUTPUT_DF = (INPUT_DF.groupby(['ID', 'DATE(MM/DD/YY)'])
             .apply(lambda x: sum(x.EXPOSURE * x.VALUE)))


ID   DATE(MM/DD/YY)
MP   5/31/05           3.8
     8/29/03           5.4
STA  1/31/03           2.1
     8/29/03           3.4
ZT   5/31/05           8.6
     6/31/05           1.2

Чтобы получить его в виде кадра данных в формате, который вы разместили, просто добавьте to_frame и reset_index:

OUTPUT_DF = (INPUT_DF.groupby(['ID', 'DATE(MM/DD/YY)'])
             .apply(lambda x: sum(x.EXPOSURE * x.VALUE))
             .to_frame('FINAL_VALUE')
             .reset_index())

>>> OUTPUT_DF
    ID DATE(MM/DD/YY)  FINAL_VALUE
0   MP        5/31/05          3.8
1   MP        8/29/03          5.4
2  STA        1/31/03          2.1
3  STA        8/29/03          3.4
4   ZT        5/31/05          8.6
5   ZT        6/31/05          1.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...