熊猫的性能问题适用

用户2727167

我有以下数据框 df

                                   time       u10  ...        av  kont
latitude  longitude                                ...                
51.799999 -3.2      2011-01-07 09:00:00 -2.217477  ...  0.008106  None
          -3.1      2011-01-07 09:00:00 -2.137205  ...  0.008202  None
51.900002 -3.1      2011-01-07 09:00:00 -2.276076  ...  0.008310  None
          -3.1      2011-01-07 10:00:00 -1.548405  ...  0.006344  None
          -3.0      2011-01-07 09:00:00 -2.200620  ...  0.008537  None
52.200001 -3.9      2011-01-05 23:00:00  1.393586  ...  0.005413  None
          -3.8      2011-01-05 21:00:00  1.972752  ...  0.007624  None
          -3.8      2011-01-05 22:00:00  1.732336  ...  0.006696  None
          -3.8      2011-01-05 23:00:00  1.551723  ...  0.005837  None
          -3.8      2011-01-06 00:00:00  1.377130  ...  0.004979  None
          -3.7      2011-01-05 21:00:00  2.124066  ...  0.008008  None
          -3.7      2011-01-05 22:00:00  1.892480  ...  0.007125  None
          -3.7      2011-01-05 23:00:00  1.710662  ...  0.006296  None
          -3.6      2011-01-05 21:00:00  2.259727  ...  0.008230  None
          -3.6      2011-01-05 22:00:00  2.044596  ...  0.007428  None
          -3.6      2011-01-05 23:00:00  1.865990  ...  0.006652  None
52.299999 -3.8      2011-01-05 23:00:00  1.652063  ...  0.006964  None

整个数据框可以从这里下载

我需要总结内群体latitudelongitudekont虽然适用,但我正在使用以下功能执行此操作:

        def summarize(group):
            s = group['kont'].eq('from').cumsum()
            return group.groupby(s).agg(
                t2m=('t2m', 'mean'),
                av=('av', 'sum'),
                ah=('tp', 'sum'),
                d1=('time', 'min'),
                d2=('time', 'max')
            )
            
        df=df.groupby(['latitude', 'longitude']).apply(summarize).reset_index(level=-1, drop=True)

输出在此处给出但是,我需要在大型数据帧上运行它,完成这些操作需要几个小时,可能是因为使用 apply。有没有纯粹的熊猫方式来加快速度?有没有其他方法,即dask?

海豆

您可以尝试按如下方式更改代码,而不使用.apply()

s = df['kont'].eq('from').cumsum()
df = (df.groupby(['latitude', 'longitude', s])
        .agg(
             t2m=('t2m', 'mean'),
             av=('av', 'sum'),
             ah=('tp', 'sum'),
             d1=('time', 'min'),
             d2=('time', 'max')
         )
     ).reset_index(level=-1, drop=True)

结果:

结果与运行原始代码相同.apply()

print(df)

                          t2m        av        ah              d1              d2
latitude  longitude                                                              
51.799999 -3.2       0.099451  0.008106  0.010043   1/7/2011 9:00   1/7/2011 9:00
          -3.1       0.343713  0.008202  0.010375   1/7/2011 9:00   1/7/2011 9:00
51.900002 -3.1       0.097055  0.014654  0.020506  1/7/2011 10:00   1/7/2011 9:00
          -3.0       0.261560  0.008537  0.010545   1/7/2011 9:00   1/7/2011 9:00
52.200001 -3.9       0.292841  0.005413  0.010704  1/5/2011 23:00  1/5/2011 23:00
          -3.8       0.207666  0.025135  0.042585  1/5/2011 21:00   1/6/2011 0:00
          -3.7       0.354354  0.021428  0.031826  1/5/2011 21:00  1/5/2011 23:00
          -3.6       0.333602  0.022311  0.031084  1/5/2011 21:00  1/5/2011 23:00
52.299999 -3.8       0.012537  0.012992  0.024472  1/5/2011 23:00   1/6/2011 0:00
          -3.7      -0.146262  0.030848  0.047126  1/5/2011 21:00   1/6/2011 0:00
          -3.6       0.150072  0.031348  0.044772  1/5/2011 21:00   1/6/2011 0:00
52.400002 -3.8       0.240045  0.007225  0.013877   1/6/2011 0:00   1/6/2011 0:00
          -3.7       0.286981  0.015497  0.025990  1/5/2011 23:00   1/6/2011 0:00
          -3.6       0.167067  0.024722  0.036369  1/5/2011 22:00   1/6/2011 0:00
          -3.5       0.199080  0.024500  0.033631  1/5/2011 22:00   1/6/2011 0:00
          -3.4       0.258915  0.024050  0.030358  1/5/2011 22:00   1/6/2011 0:00
          -2.8       0.359186  0.009324  0.010351  1/7/2011 11:00  1/7/2011 11:00
          -2.7       0.241022  0.011714  0.010068  1/7/2011 10:00  1/7/2011 10:00
52.700001 -2.8       0.378778  0.009083  0.010874   1/6/2011 0:00   1/6/2011 0:00
          -2.7       0.314325  0.019510  0.022723  1/5/2011 23:00   1/6/2011 0:00
52.799999 -3.7       0.214777  0.007146  0.011296   1/6/2011 0:00   1/6/2011 0:00
          -3.6       0.294733  0.007325  0.010927   1/6/2011 0:00   1/6/2011 0:00
          -3.6       0.300104  0.005927  0.010070  1/7/2011 17:00  1/7/2011 17:00
          -3.5       0.314325  0.007460  0.010498   1/6/2011 0:00   1/6/2011 0:00
          -3.5       0.271021  0.005504  0.010115  1/7/2011 17:00  1/7/2011 17:00
52.900002 -3.9       0.204980  0.006496  0.011364   1/6/2011 0:00   1/6/2011 0:00
          -3.8       0.378778  0.006653  0.011136   1/6/2011 0:00   1/6/2011 0:00
          -3.6       0.370264  0.005485  0.010155  1/7/2011 18:00  1/7/2011 18:00
          -3.5       0.269434  0.007051  0.010269   1/6/2011 0:00   1/6/2011 0:00
          -3.5       0.372156  0.005216  0.010152  1/7/2011 18:00  1/7/2011 18:00
53.000000 -3.9       0.050775  0.006166  0.010510   1/6/2011 0:00   1/6/2011 0:00
53.200001 -1.9       0.396478  0.017476  0.012246  1/5/2011 23:00  1/5/2011 23:00
54.200001 -2.3       0.380670  0.014101  0.010786   1/6/2011 0:00   1/6/2011 0:00
54.299999 -2.4       0.183496  0.011351  0.010115   1/6/2011 0:00   1/6/2011 0:00
          -2.3       0.122034  0.025713  0.020119  1/5/2011 23:00   1/6/2011 0:00

性能比较:

原始代码使用.apply()

%%timeit
def summarize(group):
            s = group['kont'].eq('from').cumsum()
            return group.groupby(s).agg(
                t2m=('t2m', 'mean'),
                av=('av', 'sum'),
                ah=('tp', 'sum'),
                d1=('time', 'min'),
                d2=('time', 'max')
            )
            
df.groupby(['latitude', 'longitude']).apply(summarize).reset_index(level=-1, drop=True)

303 ms ± 33.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

不使用的修改代码.apply()

%%timeit
s = df['kont'].eq('from').cumsum()
(df.groupby(['latitude', 'longitude', s])
        .agg(
             t2m=('t2m', 'mean'),
             av=('av', 'sum'),
             ah=('tp', 'sum'),
             d1=('time', 'min'),
             d2=('time', 'max')
         )
     ).reset_index(level=-1, drop=True)

15.8 ms ± 236 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

303ms vs 15.8ms:快 19.2 倍

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章