我有以下数据框架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
整个数据框架可以从这里下载。
我需要对latitude
, longitude
和kont
中的群求和。我是这样做的,虽然应用以下功能:
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()
:
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)