请原谅这个问题,因为我是一门科学专业,而不是计算机科学,而且我正在自学Python以帮助完成一个课堂项目。
我有一个从.csv导入的Pandas数据框,如下所示:
Item_ID Event_ID Value
27 83531 2533501.8
28 83531 1616262
31 83531 269829
32 83531 55.8
33 83531 269829
34 83531 4882
35 83531 269829
36 83531 4882
37 83531 55.8
38 83531 55.8
27 83532 7137904.8
28 83532 5873877.6
31 83532 497381
32 83532 55.7
33 83532 497381
34 83532 7568
35 83532 497381
36 83532 7568
37 83532 55.7
38 83532 55.7
此数据来自每天进行多次的手动输入,其中Item_ID是度量类型,Event_ID是用户对每个“数据输入事件”的唯一标识符,而value是度量值。 / p>
我需要对每个唯一的Event_Id执行许多计算。
Calc1 = ([28]/[27])*(([31]*[32])/[28])*(([33]-[34])/[33])
Calc2 = [36]/[35]
Calc3 = ([35]-[113])/[35]
Calc4 = [37]
Calc5 = [38]
上式中的每个数字代表一个Item_ID。我想用每个Event_ID在同一行中的值替换公式中的Item_ID。
该项目一个月前开始,将再运行6周。届时,将有许多数据点可以手动执行计算。
由于无法在Event_ID之间执行这些计算,因此Event_ID 85831的公式如下所示:
Calc1_Data = ([1616262]/[2533501.8])*(([269829]*[55.8])/[1616262])*(([269829]-[4882])/[269829])
Calc2_Data = [4882]/[269829]
Calc3_Data = ([497381]-[0])/[497381]) ***0 would be placed hear as Item_ID 113 does not exist for this
Event_ID
Calc4_Data = [55.7]
Calc5_Data = [55.7]
然后将结果放入一个新的数据框中,然后我可以对其进行分析。
Event_ID Clac1_Result Calc2_Result Calc3_Result Calc4_Result Calc5_Result
85829
85830
85331 RESULTS HERE
85332 RESULTS HERE
85833
85834
这是我第一次在这里提出问题,因为我已经能够在库文档或先前提出的问题中找到所有其他答案。如果我没有提供足够的信息,请告诉我,如有可能,我会澄清。
谢谢
答案 0 :(得分:1)
您可以使用groupby
,然后再使用agg
方法。
首先,将计算定义为函数:
# Define calculations
def Calc1(x):
return (x[28]/x[27])*((x[31]*x[32])/x[28])*((x[33]-x[34])/x[33])
def Calc2(x):
return x[36]/x[35]
# Calc3 = lambda x: (x[35]-x[113])/x[35] # commenting out because there's no 113 in the provided example
def Calc4(x):
return x[37]
def Calc5(x):
return x[38]
然后,使用groupby
和agg
执行计算:
df = df.set_index('Item_ID') # set 'Item_ID' to index so that we can use fewer code inside the functions
df = df.groupby('Event_ID').agg([Calc1, Calc2, Calc4, Calc5]) # group by Event_ID, and perform the set of specified calculations
df.columns = df.columns.droplevel(0) # reset column names
输出:
Calc1 Calc2 Calc4 Calc5
Event_ID
83531 5.835418 0.018093 55.8 55.8
83532 3.822212 0.015216 55.7 55.7