我正在使用两个for循环在彼此的内部来计算一个值,使用 Dataframe 列表中的元素组合。该列表由大量的 Dataframe 组成,使用两个for循环需要相当多的时间。
有什么方法能让我做得更快吗?
我用哑名称引用的函数是我计算结果的函数。
我的代码如下所示:
conf_list = []
for tr in range(len(trajectories)):
df_1 = trajectories[tr]
if len(df_1) == 0:
continue
for tt in range(len(trajectories)):
df_2 = trajectories[tt]
if len(df_2) == 0:
continue
if df_1.equals(df_2) or df_1['time'].iloc[0] > df_2['time'].iloc[-1] or df_2['time'].iloc[0] > df_1['time'].iloc[-1]:
continue
df_temp = cartesian_product_basic(df_1,df_2)
flg, df_temp = another_function(df_temp)
if flg == 0:
continue
flg_h = some_other_function(df_temp)
if flg_h == 1:
conf_list.append(1)
我的输入列表由大约5000个 Dataframe 组成,看起来像(有几百行)
| 身份证|x| Y型|z|时间|
| - ------|- ------|- ------|- ------|- ------|
| 1个|五个|七|第二章|五个|
我所做的是得到两个 Dataframe 组合的笛卡尔积,并为每个对计算另一个值'c'。如果这个值c满足一个条件,那么我向我的c_list添加一个元素,以便我可以得到满足要求的对的最终数量。
如需进一步信息;
a_function(df_1,df_2)是获得两个 Dataframe 的笛卡尔积的函数。
另一个函数如下所示:
def another_function(df_temp):
df_temp['z_dif'] = nwh((df_temp['time_x'] == df_temp['time_y'])
, abs(df_temp['z_x']- df_temp['z_y']) , np.nan)
df_temp = df_temp.dropna()
df_temp['vert_conf'] = nwh((df_temp['z_dif'] >= 1000)
, np.nan , 1)
df_temp = df_temp.dropna()
if len(df_temp) == 0:
flg = 0
else:
flg = 1
return flg, df_temp
而some_other_function看起来像这样:
def some_other_function(df_temp):
df_temp['x_dif'] = df_temp['x_x']*df_temp['x_y']
df_temp['y_dif'] = df_temp['y_x']*df_temp['y_y']
df_temp['hor_dif'] = hypot(df_temp['x_dif'], df_temp['y_dif'])
df_temp['conf'] = np.where((df_temp['hor_dif']<=5)
, 1 , np.nan)
if df_temp['conf'].sum()>0:
flg_h = 1
return flg_h
1条答案
按热度按时间jk9hmnmh1#
以下是使代码运行速度更快的方法:
for-loop
。map
,filter
,sum等内置函数,这会使你的代码更快。True
“if-else
检查布尔值时,避免使用赋值运算符。有用参考: