3

大家好

对于一个学校项目,我被 Pandas Dataframe 操作的持续时间所困扰。

我有一个形状为 (250 000 000, 200) 的数据框 df。该数据帧包含描述机器上传感器行为的变量值。它们按“循环”组织(每次机器开始一个新循环时,此变量都会增加 1)。在这个循环中,“CycleTime”描述了行在“循环”中的位置。

在“平均”数据帧中,我通过“循环时间”计算每个变量组的平均值

'anomaly_matrix' DataFrame 表示每个周期的全局异常,它是属于 Cycle 的每一行的平方差与相应 CycleTime 的平均值的总和。

我的代码示例如下

df = pd.DataFrame({'Cycle': [0, 0, 0, 1, 1, 1, 2, 2], 'CycleTime': [0, 1, 2, 0, 1, 2, 0, 1], 'variable1': [0, 0.5, 0.25, 0.3, 0.4, 0.1, 0.2, 0.25], 'variable2':[1, 2, 1, 1, 2, 2, 1, 2], 'variable3': [100, 5000, 200, 900, 100, 2000, 300, 300]})
mean = df.drop(['Cycle'], axis = 1).groupby("CycleTime").agg('mean')
anomali_matrix = df.drop(['CycleTime'], axis = 1).groupby("Cycle").agg('mean')
anomaly_matrix = anomali_matrix - anomali_matrix

for index, row in df.iterrows():
    cycle = row["Cycle"]
    time = row["CycleTime"]
    anomaly_matrix.loc[cycle] += (row - mean.loc[time])**2


>>>anomaly_matrix
   variable1    variable2   variable3
Cycle           
0   0.047014    0.25       1.116111e+07
1   0.023681    0.25       3.917778e+06
2   0.018889    0.00       2.267778e+06

我的 (250 000 000, 200) DataFrame 持续 6 小时的计算,这是由于 anomaly_matrix.loc[cycle] += (row - mean.loc[time])**2

我试图通过使用 apply 函数进行改进,但我没有成功在该 apply 函数中添加其他 DataFrame。试图矢量化熊猫也是一样的。

你知道如何加速这个过程吗?谢谢

4

1 回答 1

1

您可以使用:

df1 = df.set_index(['Cycle', 'CycleTime'])

mean = df1.sub(df1.groupby('CycleTime').transform('mean'))**2
df2 = mean.groupby('Cycle').sum()
print (df2)
       variable1  variable2     variable3
Cycle                                    
0       0.047014       0.25  1.116111e+07
1       0.023681       0.25  3.917778e+06
2       0.018889       0.00  2.267778e+06
于 2018-02-23T13:37:08.093 回答