pandy: scal (połącz) dwie ramki danych w wielu kolumnach


169

Próbuję połączyć dwie ramki danych pandy za pomocą dwóch kolumn:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

ale pojawił się następujący błąd:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4164)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4028)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120)()

KeyError: '[B_1, c2]'

Masz jakiś pomysł, jaki powinien być właściwy sposób, aby to zrobić? Dzięki!


52
left_oni right_onpowinna być listą ciągów, a nie łańcuchem, który wygląda jak lista.
root

Odpowiedzi:


312

Spróbuj tego

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

left_on: etykieta lub lista, lub nazwy pól w postaci tablicy, do których należy dołączyć w lewej ramce DataFrame. Może być wektorem lub listą wektorów o długości DataFrame, aby użyć określonego wektora jako klucza łączenia zamiast kolumn

right_on: etykieta lub lista, lub tablicowe nazwy pól do przyłączenia w prawej ramce DataFrame lub wektor / lista wektorów na dokumenty left_on


8
Jeśli left_oni right_onsą takie same ai bczy możemy użyć on = ['a', 'b']?
ahbon

4
Tak, to jest całkowicie poprawne.
user3065757

4

problem polega na tym, że używając apostrofów ustawiasz przekazywaną wartość jako ciąg znaków, podczas gdy w rzeczywistości, jak stwierdził @Shijo w dokumentacji, funkcja oczekuje etykiety lub listy, ale nie łańcucha! Jeśli lista zawiera każdą z nazw kolumn przekazanych zarówno dla lewej, jak i prawej ramki danych, to każda nazwa kolumny musi osobno znajdować się w apostrofach. Z tego, co zostało powiedziane, możemy zrozumieć, dlaczego jest to niecałkowite:

new_df = pd.merge(A_df, B_df,  how='left', left_on='[A_c1,c2]', right_on = '[B_c1,c2]')

A oto poprawny sposób korzystania z funkcji:

new_df = pd.merge(A_df, B_df,  how='left', left_on=['A_c1','c2'], right_on = ['B_c1','c2'])

3

Inny sposób na zrobienie tego: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.