2017-12-18 2 views
0

Ich weiß nicht, um dieses Problem zu nähern. Ich habe einen Datenrahmen, dieIterativer Vergleich mit Pandas

cuenta_bancaria nombre_empresa perfil_cobranza usuario_id usuario_web 
5545    a    123    500199   5012 
5551    a    123    500199   3321 
5551    a    55    500199   5541 
5551    b    55    500199   5246 

wie diese aussieht, was ich tun muß, ist zwischen jeder Zeile pro usuario_id laufen und prüfen, ob es ein Unterschied zwischen jeder Zeile, und erstellen Sie einen neuen Datensatz mit der Zeile geändert und die usuario_web verantwortlich für diese Änderung, einen Datenrahmen zu erzeugen, die wie folgt aussieht:

usuario_id  cambio   usuario_web 
500199  cuenta_bancaria 3321 
500199  perfil_cobranza 5541 
500199  nombre_empresa  5246 

gibt es eine Möglichkeit, dies zu tun? Ich arbeite mit Pandas auf Python und dieses Dataset könnte etwas groß sein, sagen wir etwa 10000 Zeilen, sortiert nach usuario_id.

Vielen Dank für jeden Hinweis.

+1

'überprüfen, ob es einen Unterschied zwischen den einzelnen Zeilen gibt 'in Bezug auf welche Spalten? Das ist wichtig. –

+0

Vergessen, das hinzuzufügen. Ich muss in diesem Fall nombre_empresa, perfil_cobranza und cuenta_bancaria vergleichen. Nehmen wir an, das Feld cuenta_bancaria hat sich zwischen Zeile 1 und Zeile 2 geändert, also muss ich es auf den neuen Datenrahmen setzen. Dann vergleiche erneut die Zeile 2 und Zeile 3 und überprüfe die Differenz, in diesem Fall auf perfil_cobranza, und lege das auf den neuen Datenrahmen. –

+0

Was passiert, wenn sich mehr als eine Spalte ändert? –

Antwort

1

Vergleichen benachbarten Reihen mit ne + shift, erhalten eine Maske, und verwenden Sie diese zu

  • Index in df die erforderlichen Zeilen in df.columns
  • Index erhalten Sie die gewünschten Spalten zu erhalten, die
ändern
c = df.columns.intersection(
     ['nombre_empresa', 'perfil_cobranza', 'cuenta_bancaria'] 
) 

i = df[c].ne(df[c].shift()) 
j = i.sum(1).eq(1) 
df = df.loc[j, ['usuario_id', 'usuario_web']] 
df.insert(1, 'cambio', c[i[j].values.argmax(1)]) 

df 

    usuario_id   cambio usuario_web 
1  500199 cuenta_bancaria   3321 
2  500199 perfil_cobranza   5541 
3  500199 nombre_empresa   5246 
+1

Arbeitete wunderbar, danke –

+0

Ich bin ein bisschen hier verloren. Soll ich das mit usuario_id sortieren, damit das funktioniert? –

+0

@JesusRincon Ich glaube nicht, dass Sie das müssen, obwohl ich nicht sagen kann, weil in diesem Beispiel nur eine ID angegeben ist. Ist etwas falsch mit dem Ergebnis? Wenn ja, würde ich Sie ermutigen, eine Frage mit einem [mcve] des Problems zu öffnen. Ich werde Ihr Problem dort besser verstehen können. –

1

Es gibt ein paar Möglichkeiten, durch einen Datenrahmen iterrate:

for index, row in df.iterrows(): 
    #blah blah blah 

aber da Sie die vorherige Zeile verweisen wollen, sind, denke ich, die einfachste von Position iterieren wird:

df2 = pd.DataFrame() 
for i in range(1, np.shape(df)[0]): 
    current = df.iloc[i] 
    last = df.iloc[i-1] 
    newrow = {'usario_id' = current['usario_id'], 'usario_web'= current['usario_web']} 
    if current['cuenta_bancaria'] != last['cuenta_bancaria']: 
     newrow['cambio'] = 'cuenta_bancaria' 
     df2 = df2.append(newrow, ignore_index = False) 
    elif current['nombre_empresa'] != last['nombre_empresa']: 
     newrow['cambio'] = 'nombre_empresa' 
     df2 = df2.append(newrow, ignore_index = False) 
    elif current['perfil_cobranza'] != last['perfil_cobranza']: 
     newrow['cambio'] = 'perfil_cobranza' 
     df2 = df2.append(newrow, ignore_index = False) 
+0

Arbeitete auch für mich. Vielen Dank –

Verwandte Themen