2016-06-14 4 views
1

Follow-up nicht überlappen: Merging two columns which don't overlap and create new columnsZusammenführen von zwei oder mehr Spalten, die zu diesem Beitrag

import pandas as pd 

df1 = pd.DataFrame([["2014", "q2", 2], 
        ["2013", "q1", 1],], 
        columns=('Year', 'Quarter', 'Value')) 

df2 = pd.DataFrame([["2016", "q1", 3], 
        ["2015", "q1", 3]], 
        columns=('Year', 'Quarter', 'Value')) 


print(df1.merge(df2, on='Year', how='outer')) 

Ergebnisse in:

Year Quarter_x Value_x Quarter_y Value_y 
0 2014  q2  2  NaN  NaN 
1 2013  q1  1  NaN  NaN 
2 2016  NaN  NaN  q1  3 
3 2015  NaN  NaN  q1  3 

Aber ich will diese bekommen:

Year Quarter Value 
0 2014  q2  2  
1 2013  q1  1  
2 2016  q1  3 
3 2015  q1  3 

Hinweis: Dies führt nicht zum gewünschten Ergebnis ... :(

print(df1.merge(df2, on=['Year', 'Quarter','Value'], how='outer').dropna()) 

    Year Quarter Value 
0 2014  q2  2 
1 2013  q1  1 

... mit 'links' oder 'rechts' oder innen auch nicht schneiden.

Antwort

2

nicht sicher, was hier passiert, aber wenn ich

df1.merge(df2, on=['Year', 'Quarter', 'Value'], how='outer').dropna() 

erhalte ich:

Year Quarter Value 
0 2014  q2 2.0 
1 2013  q1 1.0 
2 2016  q1 3.0 
3 2015  q1 3.0 

Sie können einen Blick auf die merge, join & concat docs nehmen wollen.

Die ‚intuitive‘ Weg hierfür ist wahrscheinlich .append():

df1.append(df2) 

    Year Quarter Value 
0 2014  q2 2.0 
1 2013  q1 1.0 
2 2016  q1 3.0 
3 2015  q1 3.0 

Wenn Sie den Quellcode schauen, finden Sie es concat hinter den Kulissen nennt.

Merge ist nützlich und für Fälle gedacht, in denen Sie columns mit überlappenden Werten haben.

+0

Ja, Sie wieder rechts sind. Vielen Dank! –

2

pandas concat ist viel besser dafür geeignet.

pd.concat([df1, df2]).reset_index(drop=True) 

    Year Quarter Value 
0 2014  q2  2 
1 2013  q1  1 
2 2016  q1  3 
3 2015  q1  3 

concat soll ein Datenrahmen benachbart zu einem anderen platzieren, während der Index oder Spalten ausgerichtet zu halten. Im Standardfall werden die Spalten ausgerichtet. Wenn Sie Ihre Beispieldatenfelder betrachten, werden die Spalten ausgerichtet und Ihre angegebene erwartete Ausgabe zeigt df2 genau nach df1, wo die Spalten ausgerichtet sind. Jeder Aspekt dessen, was Sie gefragt haben, ist genau das, was concat entwickelt wurde. Alles, was ich getan habe, weist Sie auf eine geeignete Funktion hin.

+0

Ich denke, ich habe das woanders gelesen, aber kannst du es ausarbeiten? –

+0

Post wurde bearbeitet, um die Ausarbeitung widerzuspiegeln. – piRSquared

+0

@Merlin wahr genug ... Bearbeitung jetzt. – piRSquared

1

Sie suchen nach dem Zufügen-Feature:

df_final = df1.append(df2)