2017-07-18 93 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