Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
减少python中的循环时间_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

减少python中的循环时间

减少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

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['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循环。此方法出现问题:。如果需要其他答案,请对此答案进行评论。如果需要其他答案,请对此答案进行评论