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分配给另一个临时变量并比较访问prevscheduled\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”吗?