Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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
For循环比较python中以前的值_Python_For Loop - Fatal编程技术网

For循环比较python中以前的值

For循环比较python中以前的值,python,for-loop,Python,For Loop,我有一个像这样的熊猫数据框 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

我有一个像这样的熊猫数据框

 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\u order
的值设置一个标志。 如果第一个订单是计划订单(
scheduled\u order=1
),则标志应设置为
0
,否则应检查分钟数是否大于12,则标志应为1,否则为2;如果下一个订单是计划订单,则标志应设置为3。如果上一个订单是实时订单(
scheduled\u 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\u order
值?

您可以将scheduled\u order分配给另一个临时变量并进行比较您可以将scheduled\u order分配给另一个临时变量并比较访问prev
scheduled\u order
作为
scheduled\u order[i-1]


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

访问上一个
计划的订单
作为
计划的订单[i-1]


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

添加一列,其中包含以前的预定顺序值:

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

添加具有上一个计划订单值的列:

df['prev_scheduled_order'] = df.scheduled_order.shift(1)
试试这个:

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)
PS我遵循了你的算法,这就是为什么我在最后一行有(flag==1)。 如果不是你想要的,请澄清算法

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

尝试以下操作:

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)
PS我遵循了你的算法,这就是为什么我在最后一行有(flag==1)。 如果不是你想要的,请澄清算法


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

为什么在输出的最后一行有flag=2?您的意思是“…如果前几分钟少于12分钟,那么在您的算法中flag应该设置为2”吗?为什么在输出的最后一行中flag=2?您的意思是“…如果前几分钟少于12分钟,那么在您的算法中标志应该设置为2”吗?