Python 3.x 从具有多个条件的数据帧执行计算

Python 3.x 从具有多个条件的数据帧执行计算,python-3.x,pandas,Python 3.x,Pandas,请原谅我的问题,因为我主修的是科学,不是计算机科学,我正在自学Python来帮助完成一个课堂项目 我有一个从.csv导入的熊猫数据框,看起来像: 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 3

请原谅我的问题,因为我主修的是科学,不是计算机科学,我正在自学Python来帮助完成一个课堂项目

我有一个从.csv导入的熊猫数据框,看起来像:

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
该数据来自每天多次进行的手动输入,其中项目ID为测量类型,事件ID为用户每个“数据输入事件”的唯一标识符,值为测量值

我需要对每个唯一的事件Id执行大量计算

Calc1 = ([28]/[27])*(([31]*[32])/[28])*(([33]-[34])/[33])
Calc2 = [36]/[35]
Calc3 = ([35]-[113])/[35]
Calc4 = [37]
Calc5 = [38]
上面公式中的每个数字都代表一个Item_ID。我希望将公式中的Item_ID替换为每个Event_ID的同一行中的值

该项目于一个月前启动,将再运行6周。到那时,将有许多数据点可以手动执行计算

由于这些计算无法跨事件ID执行,因此事件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
这是我第一次在这里提问,因为我已经能够在图书馆文档中找到我的所有其他答案或以前提出的问题。如果我没有提供足够的信息,请让我知道,如果可能,我会澄清


谢谢

您可以使用
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

谢谢,您能帮助我理解函数如何知道参数x[28]引用的是“Value”列吗?我一直在读lambda函数,但我不理解它是如何工作的。如果此数据集中有更多列,我将如何引用值列?它引用的是“值”列,因为数据框中只有该列。如果数据有更多的列,您仍然可以在值列中应用该函数,方法是指定以下列:
df.groupby('Event_ID').agg({'Value':my_calculations})
df.groupby('Event_ID').Value.agg(my_calculations)
,否则它将对每一列应用计算。感谢您的明确解释。现在我明白了。当使用
agg
方法中的函数(而不是
apply
)时,可以使用
x[idx]
引用指定的索引,其中x是函数名(即组),而
idx
是索引。使用
agg
方法中定义的函数时,请将
x
视为组中的列。另外,熟悉“来自熊猫”的概念也很重要。好的,那么在
def Calc1(x):
pandas将“x”解释为数据帧的索引?然后,通过将Item_ID列指定为索引,它使用x作为计算中数字的参考。其中在
x[36]/x[37]
中,它引用36或36作为分组集的索引行。还是我离这里很远?