2017-07-18 84 views
0

我有以下代碼在大熊貓數據幀如何遍歷行

import pandas as pd 
import numpy as np 
import csv 


location = r'C:\Users\tmaina\Desktop\scf\output.csv' 
df = pd.read_csv(location,sep='\s*,\s*',engine='python') 
for i, row in df.iterrows(): 
    if row['COUPON_NUMBER'] == 1: 
     df.OND_ORIGIN = df.DEP_FROM 
     if df.loc[i+1,'PLDATE'] == row['PLDATE'] & row['TICKET_NUMBER'] ==df.loc[i+1,'TICKET_NUMBER'] &row['COUPON_NUMBER'] == 2: 
      df.OND_DEST = df.loc[i+1,'ARR_TO'] 
     else: 
      df.OND_DEST = df.ARR_TO 
    elif row['COUPON_NUMBER'] == 2 & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER'] & row['PLDATE'] ==df.loc[i-1,'PLDATE']: 
     df.OND_ORIGIN==df.loc[i-1,'DEP_FROM'] 
     df.OND_DEST = df.ARR_TO 
    elif row['COUPON_NUMBER'] == 3 & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER'] & row['PLDATE'] !=df.loc[i-1,'PLDATE']: 
     df.OND_ORIGIN = df.DEP_FROM 
     if df.loc[i+1,'PLDATE'] == row['PLDATE'] & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER']: 
      df.OND_DEST = df.loc[i+1,'ARR_TO'] 
     else: 
      df.OND_DEST = df.ARR_TO 
    elif row['COUPON_NUMBER'] == 4 & row['TICKET_NUMBER'] ==df.loc[i-1,'TICKET_NUMBER']& row['PLDATE'] ==df.loc[i-1,'PLDATE']: 
     df.OND_ORIGIN = df.loc[i-1,'DEP_FROM'] 
     df.OND_DEST = df.ARR_TO 

df.to_csv('out.csv', sep=',',index = False) 

爲以下各列的輸出是

COUPON_NUMBER TICKET_NUMBER DEP_FROM ARR_TO OND_ORIGIN OND_DEST PLDATE STOPOVER 
    1   1054737998 HRE    NBO HRE  NBO  20170419 O 
    2   1054737998 NBO    KGL NBO  KGL  20170419 X 
    3   1054737998 KGL    NBO KGL  NBO  20170519 O 
    4   1054737998 NBO    HRE NBO  HRE  20170419 X 

所需的輸出是

COUPON_NUMBER TICKET_NUMBER DEP_FROM ARR_TO OND_ORIGIN OND_DEST PLDATE STOPOVER 
    1   1054737998 HRE   NBO HRE   KGL  20170419 O 
    2   1054737998 NBO   KGL HRE   KGL  20170419 X 
    3   1054737998 KGL   NBO KGL   HRE  20170519 O 
    4   1054737998 NBO   HRE KGL   HRE  20170419 X 

的邏輯是對於屬於特定票證的給定coupon_number,我們檢查pldate,如果更多一張優惠券在同一個月內運行,ond_originond_dest應該相等。 ond_dest的確定是通過檢查某個城市是否有停留。如果有一個,則arr_to變爲ond_dest,並且ond_origin成爲第一個沒有中止的dep_from

+0

@Chris指出,感謝您的糾正 – MTK

+0

你的原始output.csv文件格式是什麼raws? –

+0

我們需要一些樣本輸入來創建您的預期輸出。 –

回答

0

你可以用groupbyGroupertransform來做到這一點,而不是迭代每一行。爲了得到第一個和最後各組,您可以使用this

如果PLDATE是一個日期colummn你可以做這樣的事情

df['OND_ORIGIN'] = df.groupby(['TICKET_NUMBER', pd.Grouper(key='PLDATE', freq='1M')])['DEP_FROM'].transform(first) 
df['OND_DEST'] = df.groupby(['TICKET_NUMBER', pd.Grouper(key='PLDATE', freq='1M')])['ARR_TO'].transform(last) 

當你想每月組僅需要Grouper。如果是按日期,你可以做df.groupby(['TICKET_NUMBER', 'PLDATE', freq='1M'])

+0

PLDATE不是日期時間列,日期轉換爲表示日期或id的int – MTK

+0

,因爲整數可能會導致奇怪的結果,特別是當涉及'NaN'或前導零時,所以最好避免這個。在這種情況下,可以通過'df ['PLDATE'] = pd.to_datetime(df ['PLDATE']。astype(str),format ='%Y%m%d]' –

+0

注意,謝謝建議,我已經實現了上述,但是由於'first'尚未定義,所以我得到了一個名稱錯誤。 – MTK