2017-07-18 5 views
0

Ich habe folgenden CodeWie iterieren Reihen in pandas Datenrahmen

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) 

der Ausgang für die folgenden Spalten ist

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 

Der gewünschte Ausgang ist

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 

Die Logik ist, dass für ein gegebenes coupon_number zu einem bestimmten Ticket gehörend, überprüfen wir die , wenn mehr th Ein einziger Gutschein wird im selben Monat geflogen, der ond_origin und der ond_dest sollten gleich sein. Die ond_dest wird ermittelt, indem überprüft wird, ob in einer bestimmten Stadt ein Zwischenstopp stattgefunden hat. Wenn es einen gibt, wird der arr_to der ond_dest und der ond_origin wird der erste dep_from wo es keinen Halt gab.

+0

@Chris bemerkt, Vielen Dank für die Korrektur – MTK

+0

Wie ist Ihre rohe output.csv Dateiformat Raws? –

+0

Wir benötigen eine Beispieleingabe, die Ihre erwartete Ausgabe erzeugt. –

Antwort

0

Sie könnten dies mit groupby, Grouper und transform statt Iterieren über jede Zeile. Um die erste und die letzte von jeder Gruppe zu erhalten, können Sie this

verwenden Wenn PLDATE ein Datetime ist colummn Sie so etwas wie dieses

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) 

die Grouper ist nur erforderlich machen könnte, wenn Sie gruppieren möchten pro Monat. Wenn es per Datum ist, können Sie einfach tun df.groupby(['TICKET_NUMBER', 'PLDATE', freq='1M'])

+0

Das PLDATE ist keine Datetime-Spalte, das Datum wird in ein int – MTK

+0

umgewandelt, das Daten oder IDs als Ints darstellt, kann zu seltsamen Effekten führen, besonders wenn 'NaN's oder führende Nullen beteiligt sind, also besser vermeiden Dies. In diesem Fall kann das durch 'df ['PLDATE'] = pd.to_datetime (df ['PLDATE']. Astyp (str), format = '% Y% m% d)' –

+0

gemerkt werden, danke für die berate, ich habe das obige implementiert aber bekomme einen Namensfehler seit 'first' nicht definiert wurde. – MTK

Verwandte Themen