2016-03-01 9 views
6

Questo è un po 'difficile da spiegare, ma ho intenzione di fare del mio meglio. Quello che ho adesso sono due tabelle che devo unire, ma non abbiamo un ID univoco univoco. Ho un paio di colonne su cui partecipare è il meglio che posso fare e voglio solo sapere quando non abbiamo numeri uguali su entrambi i lati dei join. In questo momento, se la tabella di destra ha 1 corrispondenza con le 2 voci sulla tabella di sinistra, quella corrispondenza 1 si unisce a entrambe le voci. Questo mi lascia non sapere che il tavolo giusto ha solo 1 ingresso contro il 2 per la sinistra.Panda si uniscono senza sostituzione

Quello che voglio è unire una tabella di destra a sinistra (esterno), ma non voglio unirmi alla tabella di destra più di una volta per ogni voce. Quindi, se l'indice della tabella di destra 3 potrebbe essere unito all'indice 1 e 2 sulla sinistra, voglio solo che venga unito nell'indice 1. Inoltre, se l'indice 3 e l'indice 4 potrebbero essere uniti sull'indice 1 e 2, voglio indicizzare 1 da abbinare con l'indice 3 e l'indice 2 da abbinare all'indice 4. Se c'è solo una corrispondenza (Indice 1 -> 3), ma l'Indice 2 sulla tabella di sinistra può essere abbinato all'indice 3, Voglio Indice 2 per non essere uniti.

esempi possono meglio descrivere questo:

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 questo esempio, voglio a_df ad unirsi su b_df. Voglio b_df uniq_id 3 da abbinare con a_df uniq_id 1, e b_df 4 a a_df 2.

uscita sarebbe simile a questa:

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

Ora diciamo che vogliamo unire a_df a 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 

In questo caso, abbiamo match_id di 2 su a_df e solo 1 match_id di 2 su c_df.

In questo caso voglio solo uniq_id 1 da abbinare con uniq_id 3, lasciando sia uniq_id 2 e 4 uniq_id di essere senza pari

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 

risposta

1

ragazzi Va bene, quindi la risposta è in realtà piuttosto semplice.

È necessario raggruppare ciascun dataframe (a sinistra, a destra) in base alle colonne corrispondenti, quindi aggiungere una nuova colonna di conteggio per ciascun gruppo.

Ora si esegue il join esterno e si include la colonna del contatore, quindi verrà eseguito lo 0,1, ma se il diritto ha un 2, non corrisponde. Se la sinistra ha solo 0, corrisponderà alla destra ma se la destra ha 0,1, allora la voce giusta "1" non corrisponde!

Modifica: richiesta codice.

Non ho nulla di utile, ma è molto semplice. Se avete, diciamo, 2 colonne cercando una corrispondenza con [ 'quantita', 'data'], quindi è sufficiente fare un

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

quindi utilizzare la colonna di Helper nel join.

+0

Potrebbe per favore fornire il codice per questo esempio? –