我有像这样的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
值?
答案 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)
,以便输出与您的输出完全相同。