Problem z łączeniem pand: kolumny nakładają się, ale nie określono sufiksu

145

Mam następujące 2 ramki danych:

df_a =

     mukey  DI  PI
0   100000  35  14
1  1000005  44  14
2  1000006  44  14
3  1000007  43  13
4  1000008  43  13

df_b = 
    mukey  niccdcd
0  190236        4
1  190237        6
2  190238        7
3  190239        4
4  190240        7

Kiedy próbuję dołączyć do tych 2 ramek danych:

join_df = df_a.join(df_b,on='mukey',how='left')

Wyskakuje mi błąd:

*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')

Dlaczego tak jest? Ramki danych mają wspólne wartości „mukey”.

user308827
źródło

Odpowiedzi:

158

Twój błąd we fragmencie danych, które opublikowałeś, jest trochę tajemniczy, ponieważ nie ma wspólnych wartości, operacja łączenia kończy się niepowodzeniem, ponieważ wartości nie nakładają się, wymaga podania sufiksu dla lewej i prawej strony:

In [173]:

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
Out[173]:
       mukey_left  DI  PI  mukey_right  niccdcd
index                                          
0          100000  35  14          NaN      NaN
1         1000005  44  14          NaN      NaN
2         1000006  44  14          NaN      NaN
3         1000007  43  13          NaN      NaN
4         1000008  43  13          NaN      NaN

merge działa, ponieważ nie ma tego ograniczenia:

In [176]:

df_a.merge(df_b, on='mukey', how='left')
Out[176]:
     mukey  DI  PI  niccdcd
0   100000  35  14      NaN
1  1000005  44  14      NaN
2  1000006  44  14      NaN
3  1000007  43  13      NaN
4  1000008  43  13      NaN
EdChum
źródło
33

.join()Funkcja użyciu indexod przekazany jako zbiorze argumentów, więc należy użyć set_indexlub użycie .mergefunkcji zamiast.

Znajdź dwa przykłady, które powinny działać w Twoim przypadku:

join_df = LS_sgo.join(MSU_pi.set_index('mukey'), on='mukey', how='left')

lub

join_df = df_a.merge(df_b, on='mukey', how='left')
Velizar VESSELINOV
źródło
31

Ten błąd wskazuje, że dwie tabele mają 1 lub więcej nazw kolumn, które mają taką samą nazwę kolumny. Komunikat o błędzie oznacza: „Widzę tę samą kolumnę w obu tabelach, ale nie kazałeś mi zmienić nazwy żadnej z nich przed wprowadzeniem jednej z nich”

Możesz albo usunąć jedną z kolumn przed przeniesieniem jej z drugiej, używając del df ['nazwa kolumny'], albo użyć lsuffix, aby ponownie napisać oryginalną kolumnę, lub rsuffix, aby zmienić nazwę tej, do której jest przenoszona.

df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
user1761806
źródło
2

Głównie łączenie jest używane wyłącznie do łączenia na podstawie indeksu, a nie nazw atrybutów, więc zmień nazwy atrybutów w dwóch różnych ramkach danych, a następnie spróbuj dołączyć, zostaną one połączone, w przeciwnym razie zostanie zgłoszony ten błąd

user12690524
źródło