Ich brauche Hilfe bei der Umwandlung meiner Daten, damit ich Transaktionsdaten lesen kann.Erstellen Sie Gruppen/Klassen basierend auf Bedingungen in den Spalten
Business Case
ich zu einer Gruppe zusammen einige verwandte Transaktionen versuchen, einige Gruppen oder Klassen von Ereignissen zu erstellen. Dieser Datensatz repräsentiert Mitarbeiter, die aus verschiedenen Absenzen herauskommen. Ich möchte eine Klasse von Blättern basierend auf jeder Transaktion erstellen, die innerhalb von 365 Tagen der Urlaubsereignisklasse fällt. Um Trends zu chartern, möchte ich die Klassen nummerieren, damit ich eine Sequenz/ein Muster erhalte.
Mein Code ermöglicht es mir zu sehen, wann das allererste Ereignis aufgetreten ist, und es kann identifizieren, wenn eine neue Klasse gestartet wird, aber es nicht jede Transaktion in eine Klasse Bucket.
Anforderungen:
- alle Zeilen Tag auf, was Klasse lassen sie fallen in.
- Nummer jedes Unique Leave Event. Dieses Beispiel Index unter Verwendung von 0 Einzigartige Event verlassen 2 sein würde, Index 1 wäre würde Einzigartige Event verlassen 2, Index 3 Einzigartige Event verlassen 2 und Index 4 würde Einzigartige Event verlassen 1 usw.
I hinzugefügt werden in einer Spalte für die gewünschte Ausgabe, gekennzeichnet als "gewünschte Ausgabe". Beachten Sie, dass es viel mehr Zeilen/Ereignisse pro Person geben kann; und es kann viel mehr Leute geben.
Einige Daten
import pandas as pd
data = {'Employee ID': ["100", "100", "100","100","200","200","200","300"],
'Effective Date': ["2016-01-01","2015-06-05","2014-07-01","2013-01-01","2016-01-01","2015-01-01","2013-01-01","2014-01"],
'Desired Output': ["Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 1"]}
df = pd.DataFrame(data, columns=['Employee ID','Effective Date','Desired Output'])
einige Code Ich habe versucht
df['Effective Date'] = df['Effective Date'].astype('datetime64[ns]')
df['EmplidShift'] = df['Employee ID'].shift(-1)
df['Effdt-Shift'] = df['Effective Date'].shift(-1)
df['Prior Row in Same Emplid Class'] = "No"
df['Effdt Diff'] = df['Effdt-Shift'] - df['Effective Date']
df['Effdt Diff'] = (pd.to_timedelta(df['Effdt Diff'], unit='d') + pd.to_timedelta(1,unit='s')).astype('timedelta64[D]')
df['Cumul. Count'] = df.groupby('Employee ID').cumcount()
df['Groupby'] = df.groupby('Employee ID')['Cumul. Count'].transform('max')
df['First Row Appears?'] = ""
df['First Row Appears?'][df['Cumul. Count'] == df['Groupby']] = "First Row"
df['Prior Row in Same Emplid Class'][ df['Employee ID'] == df['EmplidShift']] = "Yes"
df['Prior Row in Same Emplid Class'][ df['Employee ID'] == df['EmplidShift']] = "Yes"
df['Effdt > 1 Yr?'] = ""
df['Effdt > 1 Yr?'][ ((df['Prior Row in Same Emplid Class'] == "Yes") & (df['Effdt Diff'] < -365)) ] = "Yes"
df['Unique Leave Event'] = ""
df['Unique Leave Event'][ (df['Effdt > 1 Yr?'] == "Yes") | (df['First Row Appears?'] == "First Row") ] = "Unique Leave Event"
df
Das ist eine elegante Lösung. Die einzige Gefahr könnte in der "Zusammenführung" liegen, wenn OP sehr große Datenrahmen verwendet, aber aufgrund des Inhalts der Daten unwahrscheinlich ist. – Khris