首页 > 解决方案 > 从具有多个条件的 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 是测量值。

我需要对每个唯一的 Event_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 周。届时,将有很多数据点需要手动执行计算。

由于无法跨 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

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

谢谢

标签: python-3.xpandas

解决方案


您可以使用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然后,使用and执行计算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

推荐阅读