减少python中的循环时间
python中的循环需要花费很长时间才能给出结果。它包含大约100k条记录 这要花很多时间。如何缩短时间减少python中的循环时间,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,python中的循环需要花费很长时间才能给出结果。它包含大约100k条记录 这要花很多时间。如何缩短时间 df['loan_agr'] = df['loan_agr'].astype(int) for i in range(len(df)): if df.loc[i,'order_mt']== df.loc[i,'enr_mt']: df['new_N_Loan'] = 1 df['exist_N_Loan'] = 0 df['n
df['loan_agr'] = df['loan_agr'].astype(int)
for i in range(len(df)):
if df.loc[i,'order_mt']== df.loc[i,'enr_mt']:
df['new_N_Loan'] = 1
df['exist_N_Loan'] = 0
df['new_V_Loan'] = df['loan_agr']
df['exist_V_Loan'] = 0
else:
df['new_N_Loan'] = 0
df['exist_N_Loan'] = 1
df['new_V_Loan'] = 0
df['exist_V_Loan'] = df['loan_agr']
可以使用loc并以矢量化方式设置新值。这种方法比使用迭代快得多,因为这些操作一次对整个列执行,而不是对单个值执行。查看pandas中有关速度优化的更多信息
例如:
mask = df['order_mt'] == df['enr_mt']
df.loc[mask, ['new_N_Loan', 'exist_N_Loan', 'exist_V_Loan']] = [1, 0, 0]
df.loc[mask, ['new_V_Loan']] = df['loan_agr']
df.loc[~mask, ['new_N_Loan', 'exist_N_Loan', 'new_V_Loan']] = [0, 1, 0]
df.loc[~mask, ['exist_V_Loan']] = df['loan_agr']
mask = df['order_mt'] == df['enr_mt']
else_mask = df['order_mt'] != df['enr_mt']
编辑:
如果您的pandas版本不支持~bitwise not运算符,则可以为else条件创建一个新掩码,与第一个条件类似
例如:
mask = df['order_mt'] == df['enr_mt']
df.loc[mask, ['new_N_Loan', 'exist_N_Loan', 'exist_V_Loan']] = [1, 0, 0]
df.loc[mask, ['new_V_Loan']] = df['loan_agr']
df.loc[~mask, ['new_N_Loan', 'exist_N_Loan', 'new_V_Loan']] = [0, 1, 0]
df.loc[~mask, ['exist_V_Loan']] = df['loan_agr']
mask = df['order_mt'] == df['enr_mt']
else_mask = df['order_mt'] != df['enr_mt']
然后对第二组定义使用else_掩码,而不是~mask
样本:
输入:
order_mt enr_mt new_N_Loan exist_N_Loan exist_V_Loan new_V_Loan loan_agr
0 1 1 None None None None 100
1 2 2 None None None None 200
2 3 30 None None None None 300
3 4 40 None None None None 400
输出:
order_mt enr_mt new_N_Loan exist_N_Loan exist_V_Loan new_V_Loan loan_agr
0 1 1 1 0 0 100 100
1 2 2 1 0 0 200 200
2 3 30 0 1 300 0 300
3 4 40 0 1 400 0 400
可以使用loc并以矢量化方式设置新值。这种方法比使用迭代快得多,因为这些操作一次对整个列执行,而不是对单个值执行。查看pandas中有关速度优化的更多信息
例如:
mask = df['order_mt'] == df['enr_mt']
df.loc[mask, ['new_N_Loan', 'exist_N_Loan', 'exist_V_Loan']] = [1, 0, 0]
df.loc[mask, ['new_V_Loan']] = df['loan_agr']
df.loc[~mask, ['new_N_Loan', 'exist_N_Loan', 'new_V_Loan']] = [0, 1, 0]
df.loc[~mask, ['exist_V_Loan']] = df['loan_agr']
mask = df['order_mt'] == df['enr_mt']
else_mask = df['order_mt'] != df['enr_mt']
编辑:
如果您的pandas版本不支持~bitwise not运算符,则可以为else条件创建一个新掩码,与第一个条件类似
例如:
mask = df['order_mt'] == df['enr_mt']
df.loc[mask, ['new_N_Loan', 'exist_N_Loan', 'exist_V_Loan']] = [1, 0, 0]
df.loc[mask, ['new_V_Loan']] = df['loan_agr']
df.loc[~mask, ['new_N_Loan', 'exist_N_Loan', 'new_V_Loan']] = [0, 1, 0]
df.loc[~mask, ['exist_V_Loan']] = df['loan_agr']
mask = df['order_mt'] == df['enr_mt']
else_mask = df['order_mt'] != df['enr_mt']
然后对第二组定义使用else_掩码,而不是~mask
样本:
输入:
order_mt enr_mt new_N_Loan exist_N_Loan exist_V_Loan new_V_Loan loan_agr
0 1 1 None None None None 100
1 2 2 None None None None 200
2 3 30 None None None None 300
3 4 40 None None None None 400
输出:
order_mt enr_mt new_N_Loan exist_N_Loan exist_V_Loan new_V_Loan loan_agr
0 1 1 1 0 0 100 100
1 2 2 1 0 0 200 200
2 3 30 0 1 300 0 300
3 4 40 0 1 400 0 400
而不是兰格伦。。。您可以将len函数更改为值。而不是rangeLen。。。您可以将len函数更改为一个值。您可以发布一小段输入数据帧吗?有人可以通过提及这是关于哪个库来改进这个问题吗?你能发布一小段输入数据帧吗?有人能通过提到这是关于什么库来改进这个问题吗?也许还可以添加一个标签。这是我最近在stack上看到的最有用的答案之一,感谢分享@Henry,链接还有更多的好技巧。我确实有一个问题,你知道这种面具方法有什么不同吗;我想问的是,它不是只在内部进行迭代,所以为什么它比通常的pythonic循环更快呢?这是否也与C与Python在后台的集成有关?有什么想法吗?嗨,亨利,谢谢你的回复在那个里不工作,因为我正在服务器上处理熊猫的订单版本。此外,我无法更新pandas lib。@AmitAmola它的速度更快,因为loc可以使用布尔数组。loc不会循环遍历数据帧,它会返回一个基于位置索引的数据帧视图。@yashul我知道了,我已经更新了我的答案,如果有帮助,请告诉我Shi Henry,非常感谢。它是超高速的。之前,我在代码片段中也使用了if循环。这个方法令人震惊:。这是我最近在stack上看到的最有用的答案之一,感谢分享@Henry,链接还有更多的好技巧。我确实有一个问题,你知道这种面具方法有什么不同吗;我想问的是,它不是只在内部进行迭代,所以为什么它比通常的pythonic循环更快呢?这是否也与C与Python在后台的集成有关?有什么想法吗?嗨,亨利,谢谢你的回复在那个里不工作,因为我正在服务器上处理熊猫的订单版本。此外,我无法更新pandas lib。@AmitAmola它的速度更快,因为loc可以使用布尔数组。loc不会循环遍历数据帧,它会返回一个基于位置索引的数据帧视图。@yashul我知道了,我已经更新了我的答案,如果有帮助,请告诉我Shi Henry,非常感谢。它是超高速的。之前,我在代码片段中也使用了if循环。此方法出现问题:。如果需要其他答案,请对此答案进行评论。如果需要其他答案,请对此答案进行评论