Tìm hiểu Pandas (Bài 3): Group, Merge dữ liệu

Ở bài này, ta sẽ giải quyết câu hỏi làm thế nào để sắp xếp lại cấu trúc dữ liệu phục vụ cho mục đích phù hợp. Ta sẽ sử dụng một số hàm phổ biến như: groupby, concat, aggregate, append,.. qua các ví dụ với tập dữ liệu thực để hiểu rõ hơn. (Các ví dụ được thao tác trên python 3.7.0 và pandas 0.23.4)

Các mục thảo luận gồm:

  • Nhóm dữ liệu (grouping of data)
  • Nối dữ liệu (merging and concatenating data)

I. Nhóm dữ liệu (grouping of data)

Groupby là phép toán thực hiện trên DataFrames, khi thực thi sẽ thực hiện 3 việc:
  • Chia tập dữ liệu
  • Phân tích dữ liệu
  • Nhóm dữ liệu
Hàm groupby:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

Tham số thường dùng:
  • by : mapping, function, label, hoặc danh sách các label. Xác định nhóm để groupby.
  • axis : int, 0: group theo hàng, 1: group theo cột (mặc định 0)
  • level : int/string, chỉ số level hoặc tên cột, mặc định None. Sử dụng với MultiIndex, để chỉ rõ lấy index nào
  • as_index : boolean, mặc định True. Giá trị True: kết quả trả về column được group sẽ là key.
  • sort : boolean, mặc định True. Sắp xếp key, để tăng hiệu suất thì hãy để False.

Group một cột

Giờ cùng thử thao tác với tập dữ liệu các đội bóng vô địch UEFA Champions League: euro_winners.csv

Kiểu của nationsGrppandas.core.groupby.DataFrameGroupBy. Cột được sử dụng để groupby sẽ là key. Sử dụng thuộc tính “groups”:

Về cơ bản, đây là dạng dictionary cho thấy tên nhóm riêng biệt và index tương ứng.

Để lấy được số quốc gia có FC vô địch (số lượng group), số FC vô địch theo từng nước (số lượng bản ghi trong từng group):

Để đưa về dạng DataFrame, sử dụng reset_index()

Thuộc tính ‘name‘ để thay đổi tên cột kết quả, ở đây là số lượng FC vô địch.

Thay vì sử dụng hàm reset_index(), ta có thể sử dụng thuộc tính as_index =False khi groupby cũng sẽ cho kết quả tương đương.

Group nhiều cột

Để xem số lần vô địch của từng FC theo từng quốc gia:

Một chút khác biệt so với khi group một cột đó là group nhiều cột thì các cột này phải được đưa dưới dạng list (trong dấu [])

Như vậy bước đầu ta có thể hiểu được cách hoạt động của groupby và cách sử dụng.

Group với MultiIndex

Ta có thể group by theo level với DataFrame có MultiIndex. Dữ liệu: goal_stats_euro_leagues_2012-13.csv

Theo thứ tự set index: Month = 0, Stat = 1 nên khi group theo level = 1 hay level = ‘Stat’ sẽ đều cho kết quả tương đương.

Thao tác với hàm aggregate:

Chú ý rằng giá trị NaN sẽ không được tính trong phép toán agg.

Có thể truyền nhiều hàm cùng lúc:

Cũng thể chỉ định cột nào sử dụng hàm nào

II. Nối dữ liệu (merging and concatenating of data)

Hàm concat

Hàm concat dùng để nối các dữ liệu cấu trúc pandas với nhau.

pandas.concat(objsaxis=0join=’outer’join_axes=Noneignore_index=Falsekeys=Nonelevels=Nonenames=Noneverify_integrity=Falsecopy=True)

Tham số thường dùng:
  • objs: danh sách các object Series, DataFrame, hoặc Panel 
  • axis: int, 0: concat theo cột, 1: concat theo hàng (mặc định 0)
  • join: inner/outer (mặc định outer)
  • ignore_index: boolean (mặc định False), giá trị True: giá trị index sẽ không được sử dụng trong khi concat. Kết quả trả về index được đánh lại từ 0

Sử dụng ignore_index:

Sử dụng logic để nối, nếu không chỉ định tham số join thì mặc định là sẽ ‘outer’



Chỉ định tham số join=’inner’:

Hàm append

Hàm append là phiên bản đơn giản của hàm concat với axis=0

DataFrame.append(otherignore_index=Falseverify_integrity=False, sort=None)

Tham số thường dùng:
  • other: danh sách object DataFrame hoặc Series/Dictionary
  • ignore_index: boolean (mặc định False), giá trị True: giá trị index sẽ không được sử dụng

Chú ý: hàm concat và append đều không thay đổi df1, mà chỉ tạo ra bản copy với phần df4 đã được nối

Append row vào DataFrame

Kiểu Series/Dictionary:

Kiểu Dictionary:

SQL-like merging/joining

Hàm merge ở đây tương tự như query trong SQL database, DataFrame object tương tự như bảng trong SQL database.

Pandas cung cấp phép toán join đầy đủ các tính năng, hiệu suất cao. Những phương thức này có hiệu suất tốt hơn so với các open source khác (chẳng hạn base::merge.data.frame trong ngôn ngữ R)

pandas.merge(leftrighthow=’inner’on=Noneleft_on=Noneright_on=Noneleft_index=Falseright_index=Falsesort=Falsesuffixes=(‘_x’‘_y’)copy=Trueindicator=Falsevalidate=None)

Tham số thường dùng:
  • left: DataFrame
  • right: DataFrame
  • how: {‘left’, ‘right’, ‘outer’, ‘inner’}, mặc định ‘inner’
  • on: tên các cột hoặc index level để join. (chú ý: phải có ở cả 2 DataFrames)
  • left_on: tên các cột hoặc index level của DataFrame bên trái để join
  • right_on: tên các cột hoặc index level của DataFrame bên phải để join
  • sort: boolean, mặc định là False
  • indicator: boolean hoặc string, mặc định là False, nếu để True: sẽ có thêm một cột “_merge”(tên cột sẽ thay đổi theo string nếu được truyền vào) với thông tin source của từng row
    • left_only: key chỉ xuất hiện ở DataFrame bên trái
    • right_only: key chỉ xuất hiện ở DataFrame bên phải
    • both: key xuất hiện ở cả 2 DataFrame
  • validate: string, mặc định là None.
    • “one_to_one” or “1:1”: kiểm tra liệu key hợp nhất có riêng biệt ở cả 2 DataFrame không
    • “one_to_many” or “1:m”: kiểm tra liệu key hợp nhất có riêng biệt ở DataFrame bên trái không
    • “many_to_one” or “m:1”: kiểm tra liệu key hợp nhất có riêng biệt ở DataFrame bên phải không
    • “many_to_many” or “m:m”: được phép nhưng không đưa ra kết quả
Giá trị tham số “how” và giá trị join SQL tương đương:
Merge method SQL Join Name Description _merge
left LEFT OUTER JOIN Chỉ sử dụng keys của frame bên trái left_only
right RIGHT OUTER JOIN Chỉ sử dụng keys của frame bên phải right_only
outer FULL OUTER JOIN Sử dụng từng keys của 2 frames both
inner INNER JOIN Sử dụng keys giao nhau của 2 frames both

Tham số “indicator”

Tham số “validate”

Pandas cung cấp tham số “validate” để kiểm tra liệu có sự trùng lặp key hợp nhất không. Tính duy nhất của khóa được kiểm tra trước khi merge, do đó sẽ chống việc tràn bộ nhớ, đồng thời đó cũng là một cách tốt để đảm bảo cấu trúc dữ liệu được như mong đợi. Nếu “validate” đúng thì kết quả sẽ được trả về, nếu không sẽ có lỗi được thông báo.

Ví dụ khi thực hiện merge như bên dưới với DataFrame B có giá trị trùng lặp thì sẽ trả ra lỗi.

 

Tài liệu tham khảo:

Add a Comment

Your email address will not be published.