Để hợp nhất hai Pandas DataFrame với cột chung, hãy sử dụng hàm merge[] và đặt tham số BẬT làm tên cột
Đầu tiên, chúng ta hãy nhập thư viện gấu trúc với bí danh -
import pandas as pd
Hãy để chúng tôi tạo DataFrame đầu tiên -
dataFrame1 = pd.DataFrame[ { "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],"Units": [100, 150, 110, 80, 110, 90] } ]
Tiếp theo, tạo DataFrame thứ 2 -
dataFrame2 = pd.DataFrame[ { "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Mercedes', 'Jaguar'],"Reg_Price": [7000, 1500, 5000, 8000, 9000, 6000] } ]
Bây giờ, hợp nhất hai DataFrames với một cột cột “Xe hơi” −
mergedRes = pd.merge[dataFrame1, dataFrame2, on ='Car']
Thí dụ
Sau đây là mã hoàn chỉnh -
import pandas as pd # Create DataFrame1 dataFrame1 = pd.DataFrame[ { "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],"Units": [100, 150, 110, 80, 110, 90] } ] print"DataFrame1 ...
",dataFrame1 # Create DataFrame2 dataFrame2 = pd.DataFrame[ { "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Mercedes', 'Jaguar'],"Reg_Price": [7000, 1500, 5000, 8000, 9000, 6000] } ] print"
DataFrame2 ...
",dataFrame2 # merge DataFrames with common column Car mergedRes = pd.merge[dataFrame1, dataFrame2, on ='Car'] print"
Merged data frame with common column...
", mergedRes
đầu ra
Điều này sẽ tạo ra đầu ra sau -
DataFrame1 ... Car Units 0 BMW 100 1 Lexus 150 2 Audi 110 3 Mustang 80 4 Bentley 110 5 Jaguar 90 DataFrame2 ... Car Reg_Price 0 BMW 7000 1 Lexus 1500 2 Audi 5000 3 Mustang 8000 4 Mercedes 9000 5 Jaguar 6000 Merged data frame with common column... Car Units Reg_Price 0 BMW 100 7000 1 Lexus 150 1500 2 Audi 110 5000 3 Mustang 80 8000 4 Jaguar 90 6000
Cập nhật ngày 22-Sep-2021 12. 12. 13
Trong mọi tình huống khoa học dữ liệu trong thế giới thực với Python, bạn sẽ mất khoảng 10 phút để hợp nhất hoặc tham gia các Khung dữ liệu Pandas lại với nhau để tạo thành tập dữ liệu phân tích của mình. Hợp nhất và tham gia các khung dữ liệu là một quy trình cốt lõi mà bất kỳ nhà phân tích dữ liệu tham vọng nào cũng cần phải thành thạo. Bài đăng trên blog này đề cập đến quá trình hợp nhất các bộ dữ liệu, nghĩa là nối hai bộ dữ liệu lại với nhau dựa trên các cột chung giữa chúng. Các chủ đề chính được đề cập ở đây
- Hợp nhất hoặc tham gia của hai khung dữ liệu là gì?
- Hợp nhất bên trong, bên ngoài, bên trái và bên phải là gì?
- Làm cách nào để hợp nhất hai khung dữ liệu với các tên cột chung khác nhau?
Nếu bạn muốn tự mình thực hiện hướng dẫn, tôi đang sử dụng thiết lập sổ ghi chép Jupyter với Python từ Anaconda và tôi đã đăng mã trên GitHub tại đây. Tôi đã đưa bộ dữ liệu mẫu vào kho lưu trữ GitHub
Dữ liệu mẫu
Đối với bài đăng này, tôi đã lấy một số dữ liệu thực từ ứng dụng KillBiller và một số dữ liệu đã tải xuống, chứa trong ba tệp CSV
- user_usage. csv – Tập dữ liệu đầu tiên chứa số liệu thống kê sử dụng thiết bị di động hàng tháng của người dùng
- user_device. csv – Tập dữ liệu thứ hai chứa thông tin chi tiết về “việc sử dụng” hệ thống của một cá nhân, với ngày tháng và thông tin thiết bị
- android_devices. csv – Tập dữ liệu thứ ba có dữ liệu về thiết bị và nhà sản xuất, liệt kê tất cả các thiết bị Android và mã mẫu của chúng, được lấy từ Google tại đây
Chúng tôi có thể tải các tệp CSV này dưới dạng Pandas DataFrames vào gấu trúc bằng cách sử dụng lệnh Pandas read_csv và kiểm tra nội dung bằng cách sử dụng lệnh DataFrame head[]
Có các thuộc tính liên kết giữa các tập dữ liệu mẫu cần lưu ý – “use_id” được chia sẻ giữa user_usage và user_device, đồng thời cột “device” của user_device và cột “Model” của tập dữ liệu thiết bị chứa các mã phổ biến
vấn đề mẫu
Chúng tôi muốn xác định xem các kiểu sử dụng của người dùng có khác nhau giữa các thiết bị khác nhau không. Ví dụ: người dùng sử dụng thiết bị Samsung có sử dụng nhiều phút gọi hơn những người sử dụng thiết bị LG không?
Chúng tôi muốn tạo một khung dữ liệu duy nhất với các cột cho số liệu sử dụng của người dùng [số cuộc gọi mỗi tháng, sms mỗi tháng, v.v.] và cả các cột có thông tin thiết bị [kiểu máy, nhà sản xuất, v.v.]. Chúng tôi sẽ cần “hợp nhất” [hoặc “tham gia”] các bộ dữ liệu mẫu của chúng tôi lại với nhau thành một bộ dữ liệu duy nhất để phân tích
Hợp nhất khung dữ liệu
“Hợp nhất” hai bộ dữ liệu là quá trình kết hợp hai bộ dữ liệu thành một và căn chỉnh các hàng từ mỗi bộ dựa trên các thuộc tính hoặc cột chung
Các từ "hợp nhất" và "tham gia" được sử dụng tương đối thay thế cho nhau trong Pandas và các ngôn ngữ khác, cụ thể là SQL và R. Trong Pandas, có các chức năng "hợp nhất" và "tham gia" riêng biệt, cả hai đều làm những việc tương tự
Trong trường hợp ví dụ này, chúng tôi sẽ cần thực hiện hai bước
- Đối với mỗi hàng trong tập dữ liệu user_usage – tạo một cột mới chứa mã “thiết bị” từ khung dữ liệu user_devices. tôi. e. đối với hàng đầu tiên, use_id là 22787, vì vậy chúng tôi chuyển đến tập dữ liệu user_devices, tìm use_id 22787 và sao chép giá trị từ cột “thiết bị” qua
- Sau khi quá trình này hoàn tất, chúng tôi lấy các cột thiết bị mới và tìm thấy "Thương hiệu bán lẻ" và "Mẫu" tương ứng từ tập dữ liệu thiết bị
- Cuối cùng, chúng ta có thể xem xét các số liệu thống kê khác nhau để chia dữ liệu sử dụng và nhóm dữ liệu do nhà sản xuất thiết bị sử dụng
Tôi có thể sử dụng vòng lặp for không?
Đúng. Bạn có thể viết các vòng lặp cho nhiệm vụ này. Đầu tiên sẽ lặp qua use_id trong tập dữ liệu user_usage, sau đó tìm phần tử phù hợp trong user_devices. Vòng lặp for thứ hai sẽ lặp lại quy trình này cho các thiết bị
Tuy nhiên, việc sử dụng vòng lặp for sẽ chậm hơn và dài dòng hơn nhiều so với việc sử dụng chức năng hợp nhất của Pandas. Vì vậy, nếu bạn gặp tình huống này – đừng sử dụng vòng lặp for
Hợp nhất user_usage với user_devices
Hãy xem cách chúng ta có thể thêm chính xác cột "thiết bị" và "nền tảng" vào khung dữ liệu user_usage bằng cách sử dụng lệnh Pandas Merge
result = pd.merge[user_usage, user_device[['use_id', 'platform', 'device']], on='use_id'] result.head[]
Vì vậy, nó hoạt động, và rất dễ dàng. Bây giờ – nó hoạt động như thế nào? . hợp nhất lệnh đang làm gì?
Lệnh hợp nhất là mục tiêu học tập chính của bài đăng này. Thao tác hợp nhất đơn giản nhất lấy khung dữ liệu bên trái [đối số đầu tiên], khung dữ liệu bên phải [đối số thứ hai], sau đó là tên cột hợp nhất hoặc cột để hợp nhất “trên”. Trong đầu ra/kết quả, các hàng từ các khung dữ liệu bên trái và bên phải được đối sánh với các giá trị chung của cột hợp nhất được chỉ định bởi "bật"
Với kết quả này, giờ đây chúng ta có thể chuyển sang lấy số nhà sản xuất và kiểu máy từ tập dữ liệu “thiết bị”. Tuy nhiên, trước tiên chúng ta cần hiểu thêm một chút về các loại hợp nhất và kích thước của khung dữ liệu đầu ra
Các loại hợp nhất bên trong, bên trái và bên phải
Trong ví dụ của chúng tôi ở trên, chúng tôi đã hợp nhất user_usage với user_devices. Bản xem trước head[] của kết quả trông rất tuyệt, nhưng điều này còn nhiều điều hơn là bắt mắt. Trước tiên, hãy xem kích thước hoặc hình dạng của đầu vào và đầu ra của lệnh hợp nhất
Tại sao kết quả có kích thước khác với cả hai khung dữ liệu gốc?
Theo mặc định, hoạt động hợp nhất Pandas hoạt động với một hợp nhất "bên trong". Hợp nhất bên trong, [hoặc nối bên trong] chỉ giữ các giá trị chung trong cả khung dữ liệu bên trái và bên phải cho kết quả. Trong ví dụ của chúng tôi ở trên, chỉ những hàng chứa giá trị use_id phổ biến giữa user_usage và user_device mới được lưu lại trong tập dữ liệu kết quả. Chúng ta có thể xác thực điều này bằng cách xem có bao nhiêu giá trị phổ biến
Có 159 giá trị của use_id trong bảng user_usage xuất hiện trong user_device. Đây là những giá trị giống nhau cũng xuất hiện trong khung dữ liệu kết quả cuối cùng [159 hàng]
Các loại hợp nhất khác
Có ba loại hợp nhất khác nhau có sẵn trong Pandas. Các loại hợp nhất này là phổ biến trên hầu hết các ngôn ngữ hướng dữ liệu và cơ sở dữ liệu [SQL, R, SAS] và thường được gọi là "tham gia". Nếu bạn chưa biết chúng, hãy tìm hiểu chúng ngay bây giờ
- Hợp nhất bên trong / Tham gia bên trong – Hành vi Pandas mặc định, chỉ giữ các hàng có giá trị “bật” hợp nhất tồn tại trong cả khung dữ liệu bên trái và bên phải
- Hợp nhất bên trái / Nối ngoài bên trái – [còn gọi là hợp nhất bên trái hoặc nối bên trái] Giữ mọi hàng trong khung dữ liệu bên trái. Trong trường hợp thiếu các giá trị của biến “bật” trong khung dữ liệu bên phải, hãy thêm các giá trị trống / NaN vào kết quả
- Hợp nhất bên phải / Nối bên ngoài bên phải – [còn gọi là hợp nhất bên phải hoặc nối bên phải] Giữ mọi hàng trong khung dữ liệu bên phải. Trường hợp thiếu các giá trị của biến “on” ở cột bên trái, hãy thêm các giá trị trống / NaN vào kết quả
- Hợp nhất bên ngoài / Nối ngoài đầy đủ – Một phép nối ngoài đầy đủ trả về tất cả các hàng từ khung dữ liệu bên trái, tất cả các hàng từ khung dữ liệu bên phải và so khớp các hàng nếu có thể, với các NaN ở nơi khác
Loại hợp nhất sẽ sử dụng được chỉ định bằng cách sử dụng tham số “làm thế nào” trong lệnh hợp nhất, nhận các giá trị “trái”, “phải”, “bên trong” [mặc định] hoặc “bên ngoài”
Sơ đồ Venn thường được sử dụng để minh họa các loại hợp nhất và nối khác nhau. Xem ví dụ này từ Stack tràn
Nếu đây là điều mới mẻ đối với bạn hoặc bạn đang cau mày nhìn vào phần trên, hãy dành thời gian xem video này về "hợp nhất các khung dữ liệu" từ Coursera để có một lời giải thích khác có thể hữu ích. Bây giờ chúng ta sẽ xem xét từng loại hợp nhất chi tiết hơn và làm việc thông qua các ví dụ về từng loại
Ví dụ về hợp nhất trái / nối trái
Hãy lặp lại thao tác hợp nhất của chúng ta, nhưng lần này hãy thực hiện "hợp nhất bên trái" trong Pandas
- Ban đầu, khung dữ liệu kết quả có 159 hàng, vì có 159 giá trị “use_id” chung giữa các khung dữ liệu bên trái và bên phải của chúng tôi và hợp nhất “bên trong” được sử dụng theo mặc định
- Đối với hợp nhất bên trái của chúng tôi, chúng tôi hy vọng kết quả sẽ có cùng số hàng như khung dữ liệu bên trái của chúng tôi “user_usage” [240], với các giá trị bị thiếu cho tất cả trừ 159 cột “nền tảng” và “thiết bị” đã hợp nhất [81 hàng]
- Chúng tôi hy vọng kết quả sẽ có cùng số hàng như khung dữ liệu bên trái vì mỗi use_id trong user_usage chỉ xuất hiện một lần trong user_device. Ánh xạ một đối một không phải lúc nào cũng đúng. Trong các hoạt động hợp nhất trong đó một hàng trong khung dữ liệu bên trái được khớp với nhiều hàng trong khung dữ liệu bên phải, nhiều hàng kết quả sẽ được tạo. tôi. e. nếu một giá trị use_id trong user_usage xuất hiện hai lần trong khung dữ liệu user_device, sẽ có hai hàng cho use_id đó trong kết quả nối
Bạn có thể thay đổi hợp nhất thành hợp nhất trái với tham số “làm thế nào” cho lệnh hợp nhất của bạn. Phần trên cùng của khung dữ liệu kết quả chứa các mục được khớp thành công và ở dưới cùng chứa các hàng trong user_usage không có use_id tương ứng trong user_device
result = pd.merge[user_usage, user_device[['use_id', 'platform', 'device']], on='use_id', how='left']
Ví dụ về hợp nhất bên phải/nối bên phải
Ví dụ, chúng ta có thể lặp lại quy trình này với nối phải / hợp nhất phải, chỉ bằng cách thay thế how=’left’ bằng how=’right’ trong lệnh hợp nhất Pandas
________số 8Kết quả dự kiến sẽ có cùng số hàng như khung dữ liệu bên phải, user_device, nhưng có một số giá trị NaN hoặc trống trong các cột bắt nguồn từ khung dữ liệu bên trái, user_usage [cụ thể là “outgoing_mins_per_month”, “outgoing_sms_per_month” và “monthly_mb”]. Ngược lại, chúng tôi mong đợi không có giá trị nào bị thiếu trong các cột bắt nguồn từ khung dữ liệu bên phải, “user_device”
Ví dụ về kết hợp bên ngoài/nối bên ngoài đầy đủ
Cuối cùng, chúng tôi sẽ thực hiện hợp nhất bên ngoài bằng cách sử dụng Pandas, còn được gọi là "nối ngoài đầy đủ" hoặc chỉ "nối bên ngoài". Phép nối ngoài có thể được coi là sự kết hợp của phép nối trái và phải hoặc ngược lại với phép nối trong. Trong các liên kết bên ngoài, mọi hàng từ các khung dữ liệu bên trái và bên phải được giữ lại trong kết quả, với các NaN không có biến liên kết phù hợp
Do đó, chúng tôi hy vọng kết quả sẽ có cùng số lượng hàng vì có các giá trị riêng biệt của “use_id” giữa user_device và user_usage, i. e. mọi giá trị nối từ khung dữ liệu bên trái sẽ có trong kết quả cùng với mọi giá trị từ khung dữ liệu bên phải và chúng sẽ được liên kết nếu có thể
Trong sơ đồ bên dưới, các hàng ví dụ từ kết quả hợp nhất bên ngoài được hiển thị, hai hàng đầu tiên là các ví dụ trong đó "use_id" phổ biến giữa các khung dữ liệu, hai hàng thứ hai chỉ bắt nguồn từ khung dữ liệu bên trái và hai hàng cuối cùng chỉ bắt nguồn từ bên phải
Sử dụng chỉ báo hợp nhất để theo dõi hợp nhất
Để hỗ trợ xác định vị trí các hàng bắt nguồn từ đâu, Pandas cung cấp một tham số "chỉ báo" có thể được sử dụng với hàm hợp nhất để tạo một cột bổ sung có tên là "_merge" trong đầu ra gắn nhãn nguồn ban đầu cho mỗi hàng
result = pd.merge[user_usage, user_device[['use_id', 'platform', 'device']], on='use_id', how='outer', indicator=True]
Hợp nhất cuối cùng – Kết hợp các chi tiết thiết bị để tạo kết quả
Quay trở lại vấn đề ban đầu của chúng tôi, chúng tôi đã hợp nhất user_usage với user_device, vì vậy chúng tôi có nền tảng và thiết bị cho mỗi người dùng. Ban đầu, chúng tôi đã sử dụng "hợp nhất bên trong" làm mặc định trong Pandas và do đó, chúng tôi chỉ có các mục nhập dành cho người dùng có cả thông tin thiết bị. Chúng tôi sẽ thực hiện lại quá trình hợp nhất này bằng cách sử dụng một phép nối bên trái để giữ tất cả người dùng, sau đó sử dụng phép hợp nhất bên trái thứ hai để cuối cùng đưa các nhà sản xuất thiết bị vào cùng một khung dữ liệu
dataFrame1 = pd.DataFrame[ { "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],"Units": [100, 150, 110, 80, 110, 90] } ]0
Sử dụng left_on và right_on để hợp nhất với các tên cột khác nhau
Các cột được sử dụng trong toán tử hợp nhất không cần phải được đặt tên giống nhau trong cả khung dữ liệu bên trái và bên phải. Trong lần hợp nhất thứ hai ở trên, lưu ý rằng ID thiết bị được gọi là "thiết bị" trong khung dữ liệu bên trái và được gọi là "Mẫu" trong khung dữ liệu bên phải
Các tên cột khác nhau được chỉ định cho các hợp nhất trong Pandas bằng cách sử dụng thông số “left_on” và “right_on”, thay vì chỉ sử dụng thông số “on”
Tính toán số liệu thống kê dựa trên thiết bị
Khi quá trình hợp nhất của chúng tôi hoàn tất, chúng tôi có thể sử dụng chức năng tổng hợp dữ liệu của Pandas để nhanh chóng tìm ra mức sử dụng trung bình cho người dùng dựa trên nhà sản xuất thiết bị. Lưu ý rằng kích thước mẫu nhỏ thậm chí còn tạo ra các nhóm nhỏ hơn, vì vậy tôi sẽ không gán bất kỳ ý nghĩa thống kê nào cho những kết quả cụ thể này
dataFrame1 = pd.DataFrame[ { "Car": ['BMW', 'Lexus', 'Audi', 'Mustang', 'Bentley', 'Jaguar'],"Units": [100, 150, 110, 80, 110, 90] } ]1
Trở thành bậc thầy về sáp nhập – Phần 2
Điều đó hoàn thành phần đầu tiên của hướng dẫn hợp nhất này. Bây giờ bạn đã chinh phục được những kiến thức cơ bản về hợp nhất và có thể giải quyết các vấn đề về hợp nhất và kết hợp của riêng bạn với thông tin ở trên. Phần 2 của bài đăng trên blog này đề cập đến các chủ đề nâng cao hơn sau đây
- Làm cách nào để bạn hợp nhất các khung dữ liệu bằng cách sử dụng nhiều cột nối/chung?
- Làm cách nào để bạn hợp nhất các khung dữ liệu dựa trên chỉ mục của khung dữ liệu?
- Sự khác biệt giữa các chức năng hợp nhất và tham gia trong Pandas là gì?
- Hợp nhất trong Python Pandas nhanh như thế nào?
Các tài nguyên hữu ích khác
Đừng để khả năng kết hợp của bạn dừng lại ở đây. Hãy thử các liên kết sau để được giải thích thêm và thông tin về chủ đề này