Ich habe einen Datenrahmen, df, die wie folgt aussieht:Eine schnelle Methode zum Vergleichen eines Wertes in einer Panda-Reihe mit einem anderen in einer vorherigen Reihe?
ID | TERM | DISC_1
1 | 2003-10 | ECON
1 | 2002-01 | ECON
1 | 2002-10 | ECON
2 | 2003-10 | CHEM
2 | 2004-01 | CHEM
2 | 2004-10 | ENGN
2 | 2005-01 | ENGN
3 | 2001-01 | HISTR
3 | 2002-10 | HISTR
3 | 2002-10 | HISTR
ID ist ein Student ID, TERM ist ein akademischer Begriff, und DISC_1 ist die Disziplin ihrer wichtigsten. Für jeden Schüler möchte ich den TERM identifizieren, wenn (und wenn) er DISC_1 geändert hat, und dann einen neuen Datenrahmen erstellen, der wann meldet. Null gibt an, dass sie sich nicht geändert haben. Die Ausgabe sieht so aus:
ID | Change
1 | 0
2 | 2004-01
3 | 0
Mein Code unten funktioniert, aber es ist sehr langsam. Ich versuchte dies mit Groupby zu tun, konnte es aber nicht. Könnte jemand erklären, wie ich diese Aufgabe effizienter erledigen könnte?
df = df.sort_values(by = ['PIDM', 'TERM'])
c = 0
last_PIDM = 0
last_DISC_1 = 0
change = [ ]
for index, row in df.iterrows():
c = c + 1
if c > 1:
row['change'] = np.where((row['PIDM'] == last_PIDM) & (row['DISC_1'] != last_DISC_1), row['TERM'], 0)
last_PIDM = row['PIDM']
last_DISC_1 = row['DISC_1']
else:
row['change'] = 0
change.append(row['change'])
df['change'] = change
change_terms = df.groupby('PIDM')['change'].max()
Ich bin etwas verwirrt über die 'TERM'-Werte. Ist 'YYYY-10' vor' YYYY-01'? Ihre erwartete Ausgabe scheint dies anzuzeigen, andernfalls hätte ID 2 mehrere Switches. Ihr Arbeitscode wird jedoch nach "TERM" sortiert, was innerhalb von Jahren die umgekehrte Reihenfolge ergibt. – root
@root ja das war ein Fehler. In letzter Minute habe ich die Daten geändert, um klarzustellen, warum ich die Spalte sortieren musste. Ich habe die Tabelle korrigiert, ID 2 hat nur einen Schalter. Vielen Dank! –