2016-02-27 115 views
0

比较我有一个熊猫数据帧这样的..for循环之前的值在Python

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),那么flag应该设置为0,否则它应该检查分钟是否大于12,那么flag应该是1 else 2然后,如果下一个订单如果先前的订单是预定的订单,那么标志应该设置为3.如果先前的顺序是活顺序(scheduled_order =0),并且如果分钟小于12则标志应该设置为2分钟,如果大于12则标志应设置为1。

我的期望的输出是

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值?

+0

为什么在输出的最后一行有flag = 2?你的意思是“......如果__previous__分钟小于12,那么标志应该设置为2”在你的算法中? – MaxU

回答

0

您可以分配scheduled_order到另一个临时变量,并比较

0

访问上一页scheduled_orderscheduled_order[i-1]

注意你可以通过这种方式访问​​i > 0否则你的代码会有问题,因为你会访问列表的最后一个元素。

0

与之前预定的订单价值添加列:

df['prev_scheduled_order'] = df.scheduled_order.shift(1) 
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我已经按照你的算法,这就是为什么我有(标志== 1)为最后一行。 如果这不是你想要的,请澄清算法。

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