我正在尝试在python中使用groupby
来基于两列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()
但它给了我一个错误。任何人都可以帮我解决这个问题。
答案 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_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
答案 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