2017-07-23 6 views
1

Ich habe zwei Pandas Datenrahmen. Die erste enthält die Kurs-ID und die ID des Ausbilders und die zweite enthält die Kurs-ID . Bewertung und Anmerkungen. Bitte beachten Sie das Beispiel unten.Verschmelzung von Datenrahmen mit bestimmten Bedingungen

Erster Datenrahmen:

df1 = pd.DataFrame({"Course ID": ["MTH101.A", "MTH102.A", "MTH101.B", "MTH203.A", "MTH123.C"], "Instructor ID": ["X01", "T08", "C02", "D03", "Q01"]}) 

zweiter Datenrahmen:

df2 = pd.DataFrame({"Course ID": ["MTH101.A", "MTH102.X", "MTH203.A", "MTH101.B", "MTH123.Q"], "Rating": ["3.7", "4.1", "4.7", "2.9", "3.1"], "Remarks": ['B', 'A', 'A+', 'C', 'B']}) 

Leider Dateneingabe Person hat in der zweiten Datenrahmen im Laufe ID Fehler gemacht. So dass in bestimmten Fällen nur die ersten Zeichen mit dem ersten Datenrahmen übereinstimmen.

Ich wünsche einen konsolidierten Datenrahmen zu erhalten, wie unten dargestellt: enter image description here

enter image description here

auf diese alle führt?

Antwort

2

können wir zusammenführen, indem Course ID passende und hängen Sie diejenigen, die nicht "vollständige Übereinstimmung" haben:

bad1 = np.where(~df1['Course ID'].isin(df2['Course ID']))[0] 
bad2 = np.where(~df2['Course ID'].isin(df1['Course ID']))[0] 

r = \ 
df1.merge(df2) \ 
    .append(pd.merge(df1.loc[bad1].assign(x=df1['Course ID'].str.split('\.').str[0]), 
        df2.loc[bad2].drop('Course ID',1).assign(x=df2['Course ID'].str.split('\.').str[0]), 
        on='x') \ 
      .drop('x', 1)) 

Ergebnis:

In [44]: r 
Out[44]: 
    Course ID Instructor ID Rating Remarks 
0 MTH101.A   X01 3.7  B 
1 MTH101.B   C02 2.9  C 
2 MTH203.A   D03 4.7  A+ 
0 MTH102.A   T08 4.1  A 
1 MTH123.C   Q01 3.1  B 
+0

Und vielleicht können Sie hinzufügen Ausgang;) Wirklich kompliziert, plus1 – jezrael

+0

@jezrael, yeah, ich habe vergessen, eine Ausgabe hinzuzufügen ... Danke! – MaxU

Verwandte Themen