2016-02-27 113 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),以便輸出與您的輸出完全相同。