2017-09-13 1 views
2

Ich habe zwei Datenframes, die ich zusammenführen möchte.Probleme beim Kombinieren von Spalten aus Datenrahmen in Pandas

   df1 
    code scale R1 R2... 
0 121  1  80 110 
1 121  2  NaN NaN 
2 121  3  NaN NaN 
3 313  1  60 60 
4 313  2  NaN NaN 
5 313  3  NaN NaN 
... 
      df2 
    code scale R1 R2... 
0 121  2  30 20 
3 313  2  15 10 
... 

ich brauche, auf der Grundlage der Gleichheit der Spalten code und scale kopieren Sie den Wert df2-df1.

Das Ergebnis sollte wie folgt aussehen:

   df1 
    code scale R1 R2... 
0 121  1  80 110 
1 121  2  30 20 
2 121  3  NaN NaN 
3 313  1  60 60 
4 313  2  15 10 
5 313  3  NaN NaN 
... 

Das Problem ist, dass es eine Menge von Spalten sein kann wie R1 und R2 und ich kann nicht überprüfen, diese einzeln, also wollte ich from this instruction etwas verwenden, aber nichts gibt mir das gewünschte Ergebnis. Ich mache etwas falsch, aber ich kann nicht verstehen, was. Ich brauche wirklich einen Rat.

+2

Was möchten Sie tun, wenn beide Datenfelder Werte für R1/R2 haben? Wenn du df1 behalten willst, könntest du 'df1.set_index (['code', 'scale']) machen. Fillna (df2.set_index (['code', 'scale'])).) Reset_index()' –

+0

@KenSyme why Machst du es nicht zur Antwort? – IanS

Antwort

4

Was möchten Sie hap Stift, wenn die beiden Datenfelder beide Werte für R1/R2 haben? Wenn Sie df1 halten möchten, können Sie

df1.set_index(['code', 'scale']).fillna(df2.set_index(['code', 'scale'])).reset_index() 

tun, nur zu halten df2 rund um die fillna in die andere Richtung zu tun. Um etwas anderes zu kombinieren, bitte die Frage klären!

+0

Danke für die Antwort! Ich habe vergessen zu erwähnen, dass die Werte in 'df1', mit Ausnahme der Zeile, in der' scale' '1' ist, immer leer sind. in der Tat, ich möchte es mit Daten aus 'df2' und anderen Datenrahmen füllen. –

3

Versuchen Sie das?

pd.concat([df,df1],axis=0).sort_values(['code','scale']).drop_duplicates(['code','scale'],keep='last')  
Out[21]: 
    code scale R1  R2 
0 121  1 80.0 110.0 
0 121  2 30.0 20.0 
2 121  3 NaN NaN 
3 313  1 60.0 60.0 
3 313  2 15.0 10.0 
5 313  3 NaN NaN 
3

Dies ist eine gute Situation für combine_first. Es ersetzt die Nullen im aufrufenden Datenrahmen vom übergebenen Datenrahmen.

df1.set_index(['code', 'scale']).combine_first(df2.set_index(['code', 'scale'])).reset_index() 

    code scale R1  R2 
0 121  1 80.0 110.0 
1 121  2 30.0 20.0 
2 121  3 NaN NaN 
3 313  1 60.0 60.0 
4 313  2 15.0 10.0 
5 313  3 NaN NaN 

Andere Lösungen

with fillna

df.set_index(['code', 'scale']).fillna(df1.set_index(['code', 'scale'])).reset_index() 

with add - ein bisschen schneller

df.set_index(['code', 'scale']).add(df1.set_index(['code', 'scale']), fill_value=0) 
Verwandte Themen