2017-06-30 3 views
1

Ich bin neu in Python Pandas, in denen ich mehrere Excel-Blätter durch eine gemeinsame ID kombinieren möchte. Außerdem ist es eine Eins-zu-Viele-Beziehung. HierPandas Spalten (Eins-zu-Viele) zusammenfügen

ist der Eingang:

df1

<b>ID  Name</b><br/> 
3763058 Andi<br/> 
3763077 Mark 

und

df2:

<b>ID Tag</b><br/> 
3763058 item1 <br/> 
3763058 item2<br/> 
3763058 item3<br/> 
3763077 item_4<br/> 
3763077 item_5<br/> 
3763077 item_6 

Ich möchte nun die beiden Pandas Datenrahmen DF1 verschmelzen und DF2 in die folgende Ausgabe (das Spalten-Tag wird in einer einzelnen Spalte pro ID zusammengeführt):

<b>ID Name Tag</b><br/> 
3763058 Andi item1, item2, item3<br/> 
3763077 Mark item_4, item_5, item_6<br/> 

Könnte mir bitte jemand helfen?

Cheers, Andi

+0

Wenn meine Antwort hilfreich war, vergessen Sie nicht [akzeptieren] (http://meta.stackexchange.com/a/5235/ 295067) es - klicke auf das Häkchen ('✓') neben der Antwort, um es von ausgegraut zu gefüllt zu schalten. Danke. – jezrael

Antwort

2

können Sie zuerst verwenden groupby mit join:

df2 = df2.groupby('ID')['Tag'].apply(', '.join).reset_index() 
print (df2) 
     ID      Tag 
0 3763058  item1, item2, item3 
1 3763077 item_4, item_5, item_6 

Dann mögliche Verwendung ist merge, vor allem, wenn df1 mehr Spalten:

df = pd.merge(df1, df2, on='ID', how='left') 
print (df) 
     ID Name      Tag 
0 3763058 Andi  item1, item2, item3 
1 3763077 Mark item_4, item_5, item_6 

Lösung mit map Wenn nötig, fügen Sie nur eine Spalte hinzu:

df2 = df2.groupby('ID')['Tag'].apply(', '.join).reset_index() 
df2['Name'] = df2['ID'].map(df1.set_index('ID')['Name']) 
print (df2) 
     ID      Tag Name 
0 3763058  item1, item2, item3 Andi 
1 3763077 item_4, item_5, item_6 Mark 

Wenn wichtige Position Name Spalte verwenden insert:

df2 = df2.groupby('ID')['Tag'].apply(', '.join).reset_index() 
df2.insert(1, 'Name', df2['ID'].map(df1.set_index('ID')['Name'])) 
print (df2) 
     ID Name      Tag 
0 3763058 Andi  item1, item2, item3 
1 3763077 Mark item_4, item_5, item_6