【发布时间】:2019-02-13 00:08:59
【问题描述】:
我编写了以下 for 循环。主要思想是,在“A_D”列中每次出现“D”时,它都会查找应该发生某些特定条件的所有可能情况。验证所有条件后,将一个值添加到列表中。
a = []
for i in df.index:
if df['A_D'][i] == 'D':
if df['TROUND_ID'][i] == ' ':
vb = df[(df['O_D'] == df['O_D'][i])
& (df['A_D'] == 'A' )
& (df['Terminal'] == df['Terminal'][i])
& (df['Operator'] == df['Operator'][i])]
number = df['number_ac'][i]
try: ## if all the conditions above are verified a value is added to a list
x = df.START[i] - pd.Timedelta(int(number), unit='m')
value = vb.loc[(vb.START-x).abs().idxmin()].FlightID
except: ## if are not verified, several strings are added to the list
value = 'No_link_found'
else:
value = 'Has_link'
else:
value = 'IsArrival'
a.append(value)
我的主要问题是 df 有数百万行,因此这个 for 循环太耗时了。是否有不需要使用 for 循环的矢量化解决方案?
【问题讨论】:
-
这看起来可能是矢量化的,但是你能提供一个minimal reproducible example吗?
-
应该始终避免 Pandas 中的循环。在上述问题中,您似乎可以通过一次过滤来避免迭代。
-
感谢您的回答。我的问题是我不知道如何将此代码改编为一个小例子。我试图尽可能减少它。将尝试更多地编辑代码。
-
@mad_ 这不是普遍真理。这是一个有用的概括,但并不总是正确的。
-
@mad_,您能澄清一下“立即过滤”是什么意思吗?
标签: python pandas performance loops numpy