gấu trúc: hợp nhất (nối) hai khung dữ liệu trên nhiều cột


168

Tôi đang cố gắng tham gia hai khung dữ liệu gấu trúc bằng hai cột:

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

nhưng gặp lỗi sau:

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]'

Bất kỳ ý tưởng những gì nên được đúng cách để làm điều này? Cảm ơn!


52
left_onright_onphải là một danh sách các chuỗi, không phải là một chuỗi trông giống như một danh sách.
root

Câu trả lời:


311

Thử cái này

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/urdy/reference/api/pandas.DataFrame.merge.html

left_on: nhãn hoặc danh sách hoặc tên trường giống như mảng để tham gia trong DataFrame bên trái. Có thể là một vectơ hoặc danh sách các vectơ có độ dài của DataFrame để sử dụng một vectơ cụ thể làm khóa nối thay vì các cột

right_on: nhãn hoặc danh sách hoặc tên trường giống như mảng để tham gia vào DataFrame bên phải hoặc vectơ / danh sách các vectơ trên các tài liệu left_on


8
Nếu left_onright_ongiống nhau ab, chúng ta có thể sử dụng on = ['a', 'b']?
ahbon

4
Vâng, điều đó là hoàn toàn hợp lệ.
dùng306557

4

vấn đề ở đây là bằng cách sử dụng dấu nháy đơn, bạn đang đặt giá trị được truyền thành một chuỗi, trong khi thực tế, như @Shijo đã nêu trong tài liệu, hàm đang mong đợi một nhãn hoặc danh sách, nhưng không phải là một chuỗi! Nếu danh sách chứa từng tên của các cột được truyền cho cả khung dữ liệu bên trái và bên phải, thì mỗi tên cột phải nằm trong dấu nháy đơn. Với những gì đã được nêu, chúng ta có thể hiểu tại sao điều này là không phù hợp:

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

Và đây là cách sử dụng đúng chức năng:

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

3

Một cách khác để làm điều này: new_df = A_df.merge(B_df, left_on=['A_c1','c2'], right_on = ['B_c1','c2'], how='left')

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.