从具有多个条件的熊猫数据框中执行计算

时间:2020-10-20 22:50:48

标签: python-3.x pandas

请原谅这个问题,因为我是一门科学专业,而不是计算机科学,而且我正在自学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

这是我第一次在这里提出问题,因为我已经能够在库文档或先前提出的问题中找到所有其他答案。如果我没有提供足够的信息,请告诉我,如有可能,我会澄清。

谢谢

1 个答案:

答案 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]

然后,使用groupbyagg执行计算:

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