我有嵌套的循环,并希望检查外循环值与每个内循环值的总和。我正在得到想要的结果,但这需要几个小时。有什么办法可以缩短时间吗。你知道吗
我使用df.iterrows()
遍历所有行。df1大小为100万,df2大小为1000。你知道吗
如果时间能减少到5-10分钟甚至更少,那将是非常有帮助的,因为同样的工作需要每天重复。你知道吗
这是数据帧的外观:
df1......
col1 col2 NEWVALUE
0 0.727900 0.007912 NaN
1 0.249418 0.087288 NaN
2 0.592969 0.443518 NaN
3 0.832903 0.101647 NaN
4 0.129666 0.321423 NaN
df2...
col1 col2 OLDVALUE
0 0.176620 0.857886 43
1 0.758241 0.086826 609
2 0.855264 0.959226 388
3 0.929884 0.349760 137
4 0.693689 0.375171 0
代码如下:
list_values = []
for idx, xitems in df1.iterrows():
savVal = -1
i = 99
for idy, yitems in df2.iterrows():
value = xitems[‘col1’] + xitems[‘col2’] + yitems[‘col1’] + yitems[‘col2’]
#it only runs for the first time to store the value into savVal
if savVal == -1:
savVal = value
else:
if value <= 1 and value < savVal:
savVal = value
i = idy
break
if i == 99:
#df1.iat[idx , ‘NEWVALUE’] = “LESSTHAN”
#in case above code throws error then alternative is list
list_values.append(“LESSTHAN”)
else:
#df1.iat[idx, ‘NEWVALUE’] = df2.loc[i, ‘OLDVALUE’]
list_values.append(df2.loc[i, ‘OLDVALUE’])
正如评论中提到的,您应该尽量避免
iterrows
,并从矩阵问题的角度来考虑这一点。我的第一步是分别计算每个数据帧的“col1”和“col2”之和然后,这些数字可以加上一点
numpy
魔法,得到两个数字的所有可能和all_values
现在将具有形状(1000000, 1000)
,这是两列的所有可能总和。你知道吗现在,下一部分是我不太清楚你想做什么。。。如果我错了,请纠正我。在我看来,您正在将
savVal
设置为df2
每次迭代的第一个值(?)在这种情况下,它的形状应该是1000000,所以我们可以这样做然后我们要找到第一个(?)小于或等于1且小于
sav_val
的内部循环的值。我们来看看这些条件是否分别满足以及
.T
是帮助我们广播到正确形状的转置。你知道吗我们可以结合我们的两个条件,使用
argmax
(参见this question)在每行中找到第一个True
值,如果没有True
值,我们将得到每行中的第一个条目(索引0)好的,快到了。
result
的形状是1000000。现在,我们可以用值<;=1和<;第一次迭代替换那些没有条目的条目。我们现在将它们设置为-999
。你知道吗result
的形状是1000000把它们放在一起
用
df1
测试1000行,用df2
测试100行。你知道吗这是真的。你知道吗
给予
给予
进步真大!在
new_func
上运行%time
,使用df1
和df2
分别有1000000行和1000行这能解决你的问题吗?还是我完全误解了你的意图?你知道吗
相关问题 更多 >
编程相关推荐