2017-06-06 5 views
1

Ich habe zwei DatenrahmenPandas verschmelzen zwei df

df1 Form verfolgt hat

ID col1 col2 
0 1  2  10 
1 3  1  21 

und DF2 sieht aus wie dieses

ID field1 field2 
0 1  4   1 
1 1  3   3 
2 3  5   4 
3 3  9   5 
4 1  2   0 

ich beide Datenrahmen verketten wollen, aber so, dass ich nur eine Zeile pro ID, so würde es so aussehen:

ID col1 col2 field1_1 field2_1 field1_2 field2_2 field1_3 field2_3 
0 1 2  10  4   1   3   3   2   0 
1 3 1  21  5   4   9   5 

Ich habe versucht, die Daten zu verschmelzen und zu schwenken df.pivot(index=df1.index, columns='ID') Aber weil die Länge variabel ist, werde ich ein ValueError.

ValueError: all arrays must be same length

+0

würde ich zuerst manipulieren 'df2' so dass die Idee wird als eindeutiger Schlüssel ähnlich wie' df1' handeln. Dann, sobald sie die gleiche Anzahl von Reihen haben, würde ich eine Verkettung machen. – quantik

Antwort

1

Ohne über die Formatierung, wollen wir eine Ebene eines Multi-Index fusionieren und hinzufügen, die die 'ID' s zählt.

df = df1.merge(df2) 
cc = df.groupby('ID').cumcount() 
df.set_index(['ID', 'col1', 'col2', cc]).unstack() 

      field1   field2   
        0 1 2  0 1 2 
ID col1 col2         
1 2 10  4.0 3.0 2.0 1.0 3.0 0.0 
3 1 21  5.0 9.0 NaN 4.0 5.0 NaN 

Wir nageln können die Formatierung mit:

df = df1.merge(df2) 
cc = df.groupby('ID').cumcount() + 1 
d1 = df.set_index(['ID', 'col1', 'col2', cc]).unstack().sort_index(axis=1, level=1) 
d1.columns = d1.columns.to_series().map('{0[0]}_{0[1]}'.format) 
d1.reset_index() 

    ID col1 col2 field1_1 field2_1 field1_2 field2_2 field1_3 field2_3 
0 1  2 10  4.0  1.0  3.0  3.0  2.0  0.0 
1 3  1 21  5.0  4.0  9.0  5.0  NaN  NaN 
Verwandte Themen