2017-11-28 2 views
0

Ich habe ein Datenrahmen genannt df Spalte GENDER, AGE und ID und anderen Spalten, und es ist ein weiterer Datenrahmen genannt df_2 die GENDER nur 3 Spalten hat auch AGE und ID. Ich möchte den Wert GENDER und AGE in df mit Werten von df_2 aktualisieren.Fater Update Pandas Dataframe

So sind meine Ideen

df_id = df.ID.tolist() 
df_2_id = df_2.ID.tolist() 

df = df.set_index('ID') 
df_2 = df_2.set_index('ID') 

# all the ids in df_2_id are in df_id 
for id in tqdm.tqdm_notebook(df_2_id): 
    df.loc[id, 'GENDER'] = df_2.loc[id, 'GENDER'] 
    df.loc[id, 'AGE'] = df_2.loc[id, 'AGE'] 

jedoch nur die für Schleife 17,2 Iterationen pro Sekunde hat, und es dauert etwa 2 Stunden, um die Daten zu aktualisieren. Wie kann ich es schneller machen?

+0

nicht Pandas mit würde es schneller – Flika205

+0

nicht 'df [ 'Geschlecht'] = df_2 [ 'Geschlecht']' 'dann df [ 'AGE'] = df_2 [ 'alte']' Arbeit? Warum benutzen Sie eine For-Schleife über 'ID'? –

+0

@ juanpa.arrivillaga, da die 'df' und' df_2' unterschiedliche Formen haben. –

Antwort

4

Ich glaube, Sie müssen zuerst intersection von Indizes und dann Werte gesetzt:

idx = df.index.intersection(df_2.index) 
df.loc[idx, 'GENDER'] = df_2['GENDER'] 
df.loc[idx, 'AGE'] = df_2['AGE'] 

Oder concat sie zusammen und Duplikate entfernen, letzten Wert halten:

df = pd.concat([df, df_2]) 
df = df[~df.index.duplicated(keep='last')] 

ähnliche Lösung:

df = pd.concat([df, df_2]).reset_index().drop_duplicates('ID', keep='last') 

Beispiel:

df = pd.DataFrame({'ID':list('abcdef'), 
        'AGE':[5,3,6,9,2,4], 
        'GENDER':list('aaabbb')}) 

#print (df) 


df_2 = pd.DataFrame({'ID':list('def'), 
        'AGE':[90,20,40], 
        'GENDER':list('eee')}) 

#print (df_2) 

df = df.set_index('ID') 
df_2 = df_2.set_index('ID') 

idx = df.index.intersection(df_2.index) 
df.loc[idx, 'GENDER'] = df_2['GENDER'] 
df.loc[idx, 'AGE'] = df_2['AGE'] 

print (df) 
    AGE GENDER 
ID    
a  5  a 
b  3  a 
c  6  a 
d 90  e 
e 20  e 
f 40  e 
+0

Hallo, tut mir leid, das 'df' hat andere Spalten außer' GENDER', 'AGE' und' ID'. Funktioniert Ihre Methode noch? –

+0

Und 'df_2' nicht? es hat nur 3 Spalten? – jezrael

+0

'df_2' hat nur 3 Spalten –