2016-03-01 15 views
6

To jest trochę trudne do wytłumaczenia, ale spróbuję jak najlepiej. To, co mam teraz, to dwie tablice, które muszę połączyć, ale tak naprawdę nie mamy unikalnego identyfikatora join. Mam kilka kolumn do przyłączenia się, co jest najlepsze, co mogę zrobić, i chcę tylko wiedzieć, kiedy nie mamy równych liczb po obu stronach złączeń. Teraz, jeśli właściwa tabela ma 1 pasującą do 2 pozycji na lewej tabeli, to 1 dopasowanie łączy się z obydwoma wpisami. To sprawia, że ​​nie wiem, że właściwa tabela ma tylko jedno wejście w stosunku do 2 po lewej.Pandy dołączane bez wymiany

To, czego chcę, to dołączenie do prawej tabeli po lewej stronie (na zewnątrz), ale nie chcę dołączać do właściwej tabeli więcej niż raz na pozycję. Więc jeśli prawy indeks tabeli 3 może być połączony na indeksie 1 i 2 po lewej stronie, chcę tylko, aby był połączony na indeksie 1. Również, jeśli indeks 3 i indeks 4 mogą być połączone na indeksie 1 i 2, chcę indeks 1 do dopasowania do indeksu 3, a indeksu 2 do indeksu 4. Jeśli jest tylko 1 mecz (indeks 1 -> 3), ale indeks 2 na lewej tabeli można dopasować do indeksu 3, chcę indeks 2, aby się nie połączyć.

Przykładami mogą najlepiej opisują to:

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 

W tym przykładzie chcę a_df dołączyć na b_df. Chcę b_df uniq_id 3, należy dostosować do a_df uniq_id 1 i b_df 4 do a_df 2.

wyjście będzie wyglądać następująco:

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

Teraz powiedzmy, że chcemy dołączyć a_df do c_df:

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 

W tym przypadku mamy match_ids of 2 na a_df i tylko 1 match_id of 2 na c_df.

W tym przypadku po prostu chcę uniq_id 1, należy dostosować do uniq_id 3, pozostawiając zarówno uniq_id 2 i 4 uniq_id być niedopasowane

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 

Odpowiedz

1

Alright chłopaki, więc odpowiedź jest rzeczywiście bardzo prosty.

Należy dokonać grupowania każdej ramki danych (lewej, prawej) według zgodnych kolumn, a następnie dodać nową kolumnę licznika dla każdej grupy.

Teraz robisz zewnętrzne sprzężenie i dodajesz kolumnę licznika, więc dopasujesz się do 0,1, ale jeśli prawa ma 2, to nie pasuje. Jeśli lewe ma tylko 0, pasuje do prawej, ale jeśli prawo ma wartość 0,1, prawy wpis "1" nie pasuje!

Edytuj: Żądanie kodu.

Nie mam nic pod ręką, ale to bardzo proste. Jeśli, powiedzmy, 2 kolumny jesteś dopasowanie na [ „ilość”, „data”], a następnie po prostu zrobić

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

Następnie użyj kolumny pomocnik w sprzężeniu.

+0

Czy możesz podać kod dla tego przykładu? –

Powiązane problemy