有没有办法执行此循环?

PiVi

您是否知道不使用for循环是否有更好的方法来执行此任务?

从以下数据集开始:

import pandas as pd    
df = pd.DataFrame({'A': [90, 85, 85, 85, 100, 170, 150, 130, 125, 125], 
'B':[100, 100, 100, 100, 100, 100, 100, 100, 100, 100]})
df['C'] = 0
df.loc[0, 'C'] = df.loc[0, 'B']
df['D'] = 0
df.loc[0, 'D'] = df.loc[0, 'C'] * 0.95
df['E'] = 0
df.loc[0, 'E'] = df.loc[0, 'C'] * 0.80

现在,如果第1行第A列中的值大于第0行第D列中的值

  • 第1行第C列中的值将等于第1行第A列中的值* 2
  • 第1行D列中的值将等于第1行C列中的值* 0.95
  • E行1列中的值将等于D行1列中的值* 0.8

elif如果第1行第A列中的值小于第0行第E列中的值

  • 第1行C列中的值将等于第1行A列中的值
  • 第1行D列中的值将等于第1行C列中的值* 0.95
  • E行1列中的值将等于D行1列中的值* 0.8

其他:

  • C行第1行中的值将等于C行第0行中的值
  • 第1行D列中的值将等于第1行C列中的值* 0.95
  • E行1列中的值将等于D行1列中的值* 0.8

作为输出,我想创建一个像这样的df:

df_out = pd.DataFrame({'A': [90, 85, 85, 85, 100, 170, 150, 130, 125, 125], 
'B':[100, 100, 100, 100, 100, 100, 100, 100, 100, 100],
'C':[100, 100, 100, 100, 200, 200, 150, 150, 150, 150],
'D':[95, 95, 95, 95, 190, 190, 190, 143, 143, 143],
'E':[80, 80, 80, 80, 160, 160, 160, 120, 120, 120]})

考虑到我必须遍历5000多个行,并针对3000多种可能的场景,我正在寻找执行此任务的最快方法,并且我注意到for循环非常慢。

预先谢谢你们,并对这个琐碎的问题表示歉意!!我是python的新手,我正在尝试学习尽可能多的东西!

最好

里克·M

根据我们在评论中的讨论,如果您以这种方式执行循环,则速度相当快:

alist = [90, 85, 85, 85, 100, 170, 150, 130, 125, 125] * 500

a = alist[0]
c = 100
d = 95
e = 80
clist = [c]
dlist = [d]
elist = [e]
for a in alist[1:]:
    if a > d:
        c_new = round(a*1.5)
    elif a < e:
        c_new = a
    else:
        c_new = c
    c = c_new
    d = round(c_new * 0.95)
    e = round(d * 0.8)
    clist.append(c_new)
    dlist.append(d)
    elist.append(e)

df_out = pd.DataFrame({ 'A' : alist, 'C' : clist, 'D' : dlist, 'E' : elist })

print(df_out.head(10))
     A    C    D    E
0   90  100   95   80
1   85  100   95   76
2   85  100   95   76
3   85  100   95   76
4  100  150  142  114
5  170  255  242  194
6  150  150  142  114
7  130  150  142  114
8  125  150  142  114
9  125  150  142  114

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章