2017-07-09 4 views
0

Ich bin neu in Python. Ich versuche, den Code auf dem Python-Datenrahmen zu schreiben, um die Daten zu durchlaufen. Unten sind meine Ausgangsdaten:Schleife durch groupby in Python-Datenframe

A B C Start Date End Date 
1 2 5 01/01/15 1/31/15 
1 2 4 02/01/15 2/28/15 
1 2 7 02/25/15 3/15/15 
1 2 9 03/11/15 3/30/15 
1 2 8 03/14/15 4/5/15 
1 2 3 03/31/15 4/10/15 
1 2 4 04/05/15 4/27/15 
1 2 11 04/15/15 4/20/15 
4 5 23 5/6/16  6/6/16 
4 5 12 6/10/16  7/10/16 

Ich möchte eine neue Spalte als forward_c erstellen. Vorwärts_C sind die Daten dieser Zeile, die die folgenden Bedingungen erfüllt:

  1. Spalte A und B sollten gleich sein.
  2. Start_Datum der Zeile sollte größer als Startdatum und Enddatum der aktuellen Zeile sein.

Die erwartete Ausgabe lautet:

A B C Start Date End Date Forward_C 
1 2 5 01/01/15 1/31/15  4 
1 2 4 02/01/15 2/28/15  9 
1 2 7 02/25/15 3/15/15  3 
1 2 9 03/11/15 3/30/15  3 
1 2 8 03/14/15 4/5/15   11 
1 2 3 03/31/15 4/10/15  11 
1 2 4 04/05/15 4/27/15   0 
1 2 11 04/15/15 4/20/15   0 
4 5 23 5/6/16  6/6/16   12 
4 5 12 6/10/16  7/10/16   0 

ich unten Code schrieb das zu erreichen, gleich:

df = data.groupby(['A','B'], as_index = False).apply(lambda x: 
x.sort_values(['Start Date','End Date'],ascending = True)) 

for i,j in df.iterrows(): 

    for index,row in df.iterrows(): 

     if (j['A'] == row['A']) and (j['B'] == row['B']) and (row['Start Date'] > j['End Date']) and (j['Start Date'] < row['Start Date']): 

      j['Forward_C'] = row['C'] 

      df.loc[i,'Forward_C'] = row['C'] 

      break 

ich mich gefragt, ob es eine effizientere Art und Weise ist das gleiche in Python zu tun . Weil jetzt wird mein Code durch alle Zeilen für jeden Datensatz durchlaufen. Dies wird die Performance verlangsamen, da es sich um mehr als 10 Millionen Datensätze handelt.

Ihre Eingabe wird geschätzt. Vielen Dank im Voraus.

Grüße, RD

+1

Hallo Roopa. Sie haben eine Ihrer Bedingungen für forward_c erwähnt: "Spalte A und B sollten gleich sein." Aber Spalte A und B sind nicht gleich für viele Zeilen, in denen Sie einen Wert für forward_c in Ihrer erwarteten Ausgabe haben. Können Sie bitte klarstellen? –

+0

Hallo Roopa. Sie erwähnen auch * Start_Datum der Zeile sollte größer sein als Startdatum ... *. Wie kann ein Wert größer sein als er selbst? Meinst du über verschiedene Reihen hinweg? – Parfait

+0

Es tut mir leid für die Verwirrung erstellt. Wenn ich sage, dass Spalte A und Spalte B gleich sein sollen. Der Wert von A und B sollte gleich den anderen Zeilen A und B sein. In meinem Beispiel haben die ersten 8 Zeilen dieselben Werte für Spalte A und B. Außerdem vergleiche ich das Startdatum einer Zeile mit dem Startdatum einer anderen Zeile von selbst. Ich hoffe, das ist klar. Bitte lassen Sie mich für weitere Ausarbeitung wissen. –

Antwort

0

war ich mit der Frage nicht ganz klar. basierend auf meinem Verständnis, das ist was ich mir vorstellen konnte. Ich benutze Cross Join statt einer Schleife.

import pandas 
data = #Actual Data Frame 
data['Join'] = "CrossJoinColumn" 
df1 = pandas.merge(data,data,how = "left",on = "Join",suffixes = ["","_2"]) 
df1 = df1[(df1['A'] == df1['A_2']) & (df1['B'] == df1['B_2']) & (df1['Start Date'] < df1['Start Date_2']) & (df1['End Date'] < df1['Start Date_2'])].groupby(by =['A','B','C','Start Date','End Date']).first().reset_index()[['A','B','C','Start Date','End Date','C_2']] 
df1 = pandas.merge(data,df1,how = "left",on = ['A','B','C','Start Date','End Date'])