for循环比较python中的先前值

时间:2016-02-27 15:21:30

标签: python for-loop

我有像这样的pandas数据框..

 order_id buyer_id scheduled_order  minutes   flag  
  525      232               1        13      Null   
  862      232               1        14      Null   
 1361      232               1        15      Null   
 1373      232               1        13      Null   
 1580      232               1        14      Null   
 1729      232               0        11      Null   
 1817      232               1        18      Null  

我想根据scheduled_order的值设置标记。 如果第一个订单是排程订单(scheduled_order =1)标志应该设置为0,否则它应该检查分钟是否大于12然后标志应该是1否则2然后,如果先前的订单被安排,则为下一个订单然后,标志应设置为3.如果先前的订单是实时订单(scheduled_order =0)并且如果分钟小于12,则标志应设置为2.如果分钟大于12,则标志应设置为1。 / p>

我想要的输出是

order_id buyer_id scheduled_order  minutes   flag  
  525      232               1        13      0   
  862      232               1        14      3   
 1361      232               1        15      3   
 1373      232               1        13      3   
 1580      232               1        14      3   
 1729      232               0        11      3   
 1817      232               1        18      2

这是我在python中的代码

for i in range(len(df)):
    if(df.scheduled_order[i]  == '1'):
            speed.flag[i] = '0'
    else:
        if(minutes > 12):
            df.flag[i] = '1'
        else:
            df.flag[i] = '2'

但是当i变为1时,如何检查以前的scheduled_order值?

4 个答案:

答案 0 :(得分:0)

您可以将scheduled_order指定给另一个临时变量并进行比较

答案 1 :(得分:0)

scheduled_order访问为scheduled_order[i-1]

注意您可以在i > 0时以这种方式访问​​,否则您的代码会出错,因为您将访问列表的最后一个元素。

答案 2 :(得分:0)

添加包含先前排程订单值的列:

df['prev_scheduled_order'] = df.scheduled_order.shift(1)

答案 3 :(得分:0)

试试这个:

from __future__ import print_function

import pandas as pd


# create DataFrame from the CSV file
df = pd.read_csv('data.csv', delimiter=r'\s+')

# set flag to 3, for all rows where previous 'scheduled_order' == 1
# except first row
df.ix[(df.index > 0) & (df['scheduled_order'].shift(1) == 1), ['flag']] = 3

# set flag to 1, for all rows where previous 'scheduled_order' != 1
# and minutes > 12
# except first row
df.ix[(df.index > 0) & (df['scheduled_order'].shift(1) != 1) & (df['minutes'] > 12), ['flag']] = 1

# set flag to 2, for all rows where previous 'scheduled_order' != 1
# and minutes <= 12, except first row
df.ix[(df.index > 0) & (df['scheduled_order'].shift(1) != 1) & (df['minutes'] <= 12), ['flag']] = 2

# set flag for the first row ...
if df.ix[0]['scheduled_order'] == 1:
    df.ix[0, ['flag']] = 0
else:
    if df.ix[0]['minutes'] > 12:
        df.ix[0, ['flag']] = 1
    else:
        df.ix[0, ['flag']] = 2

print(df)

输出:

   order_id  buyer_id  scheduled_order  minutes flag
0       525       232                1       13    0
1       862       232                1       14    3
2      1361       232                1       15    3
3      1373       232                1       13    3
4      1580       232                1       14    3
5      1729       232                0       11    3
6      1817       232                1       18    1

PS我已经按照你的算法,这就是为什么我有(flag == 1)为最后一行。 如果不是您想要的,请澄清算法。

如果您想与“之前”的分钟进行比较,请进行以下更换:df['minutes'] - &gt; df['minutes'].shift(1),以便输出与您的输出完全相同。