2016-03-01 11 views
6

Das ist ein bisschen schwer zu erklären, aber ich werde mein Bestes versuchen. Was ich gerade habe, sind zwei Tabellen, die ich zusammenfügen muss, aber wir haben keine eindeutige Join-ID. Ich habe ein paar Spalten, denen ich beitreten kann. Das ist das Beste, was ich tun kann, und ich möchte nur wissen, wann wir nicht die gleichen Zahlen auf beiden Seiten der Joins haben. Wenn jetzt die rechte Tabelle 1 Übereinstimmung mit den 2 Einträgen in der linken Tabelle hat, dann stimmt diese 1 Übereinstimmung mit beiden Einträgen überein. Das lässt mich nicht wissen, dass der richtige Tisch nur 1 Eintrag hat, während der 2 für den linken.Pandas beitreten ohne Ersatz

Was ich möchte ist eine rechte Tabelle zu einer linken (äußeren), aber ich möchte nicht die richtige Tabelle mehr als einmal pro Eintrag. Also, wenn der rechte Tabellenindex 3 auf Index 1 und 2 auf der linken Seite verbunden werden könnte, möchte ich nur, dass er auf Index 1 zusammengefügt wird. Wenn Index 3 und Index 4 auch auf Index 1 und 2 verbunden werden könnten, möchte ich index 1 wird mit Index 3 und Index 2 mit Index 4 abgeglichen. Wenn es nur 1 Übereinstimmung (Index 1 -> 3) gibt, aber Index 2 auf der linken Tabelle mit Index 3 übereinstimmen könnte, möchte ich Index 2 nicht verbunden sein. kann diese

Beispiele am besten beschreiben:

a_df = pd.DataFrame.from_dict({1: {'match_id': 2, 'uniq_id': 1}, 2: {'match_id': 2, 'uniq_id': 2}}, orient='index') 

In [99]: a_df 
Out[99]: 
    match_id uniq_id 
1   2  1 
2   2  2 


In [100]: b_df = pd.DataFrame.from_dict({3: {'match_id': 2, 'uniq_id': 3}, 4: {'match_id': 2, 'uniq_id': 4}}, orient='index') 

In [101]: b_df 
Out[101]: 
    match_id uniq_id 
3   2  3 
4   2  4 

In diesem Beispiel möchte ich a_df auf b_df beizutreten. Ich möchte b_df 3 uniq_id mit a_df uniq_id 1 und b_df 4 bis a_df 2.

Output abgestimmt werden würde wie folgt aussehen:

Out[106]: 
    match_id_right match_id uniq_id uniq_id_right 
1    2   2  1    3 
2    2   2  2    4 

Lassen Sie uns jetzt sagen, dass wir a_df zu c_df anschließen möchten:

In [104]: c_df = pd.DataFrame.from_dict({3: {'match_id': 2, 'uniq_id': 3}, 4: {'match_id': 3, 'uniq_id': 4}}, orient='index') 

In [105]: c_df 
Out[105]: 
    match_id uniq_id 
3   2  3 
4   3  4 

In diesem Fall haben wir match_ids von 2 auf a_df und nur 1 match_id von 2 auf c_df.

In diesem Fall möchte ich nur uniq_id 1 mit uniq_id 3 angepasst werden, sowohl uniq_id 2 und uniq_id 4 verlassen unerreichte

match_id_right match_id uniq_id uniq_id_right 
1    2   2  1    3 
2    NaN   2  2   NaN 
4    3  NaN  NaN    4 

Antwort

1

Okay Jungs zu sein, so dass die Antwort ist eigentlich ziemlich einfach.

Sie müssen jeden Datenrahmen (links, rechts) nach den übereinstimmenden Spalten gruppieren und dann für jede Gruppe eine neue Zählerspalte hinzufügen.

Jetzt machen Sie den äußeren Join und fügen Sie die Zählerspalte ein, so dass Sie auf 0,1 übereinstimmen, aber wenn das Recht eine 2 hat, dann passt es nicht. Wenn die linke nur 0 hat, wird sie mit der rechten übereinstimmen, aber wenn die rechte 0,1 hat, stimmt der rechte '1' Eintrag nicht überein!

Edit: Code-Anfrage.

Ich habe nichts handliches, aber es ist sehr einfach. Wenn Sie haben, sagen wir, zwei Spalten sind passend Sie auf [ ‚Menge‘, ‚date‘], dann tun Sie einfach eine

left_df['Helper'] = left_df.groupby(['amount','date']).cumcount() 
right_df['RHelper'] = right_df.groupby(['amount','date']).cumcount() 

dann die Helfer Spalte in der Verknüpfung verwenden.

+0

Könnten Sie bitte den Code für dieses Beispiel angeben? –

Verwandte Themen