将Groupby函数应用于python中的多列并进行计算

时间:2018-05-24 14:10:32

标签: python pandas pandas-groupby

我正在尝试在python中使用groupby来基于两列INPUT_DFID划分DATE(MM/DD/YY),然后对分组的行执行数学运算。

分组行的数学函数是:EXPOSURE * VALUE。对于分组IDDATE,可能会有多次曝光,在这种情况下应该是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 :(得分:3)

这是一种方式:

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_framereset_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

答案 1 :(得分:2)

在应用groupby之前计算您的sumproduct列,然后只需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