Mục tiêu công thức
Bạn đã bao giờ cố gắng thực hiện một phân tích các tính năng chéo cho rằng bạn cần tạo cơ sở crosstabs trên các tính năng khác nhau.
Vì vậy, đây là công thức trên chúng ta có thể tạo crosstabs từ một từ điển trong Python.
Làm chủ nghệ thuật làm sạch dữ liệu trong học máy
Mục lục
- Mục tiêu công thức
- Bước 1 - Nhập thư viện
- Bước 2 - Thiết lập dữ liệu
- Bước 3 - Làm bảng crosstab
Bước 1 - Nhập thư viện
import pandas as pd
import seaborn as sns
4
Bước 2 - Thiết lập dữ liệu
Bước 2 - Thiết lập dữ liệu
Bước 3 - Làm bảng crosstab
Bước 3 - Làm bảng crosstab
Chúng tôi đã nhập khẩu gấu trúc cần thiết.
first_name last_name age Comedy_Score Rating_Score
0 Sheldon Copper 42 9 25
1 Raj Koothrappali 38 7 25
2 Leonard Hofstadter 36 8 49
3 Howard Wolowitz 41 8 62
4 Amy Fowler 35 5 70
age 35 36 38 41 42 All
first_name
Amy 1 0 0 0 0 1
Howard 0 0 0 1 0 1
Leonard 0 1 0 0 0 1
Raj 0 0 1 0 0 1
Sheldon 0 0 0 0 1 1
All 1 1 1 1 1 5
first_name Amy Howard Leonard Raj Sheldon All
age Comedy_Score
35 5 1 0 0 0 0 1
36 8 0 0 1 0 0 1
38 7 0 0 0 1 0 1
41 8 0 1 0 0 0 1
42 9 0 0 0 0 1 1
All 1 1 1 1 1 5
first_name Amy Howard Leonard Raj Sheldon All
age Comedy_Score Rating_Score
35 5 70 1 0 0 0 0 1
36 8 49 0 0 1 0 0 1
38 7 25 0 0 0 1 0 1
41 8 62 0 1 0 0 0 1
42 9 25 0 0 0 0 1 1
All 1 1 1 1 1 5
Giới thiệu
Pandas cung cấp một số tùy chọn để nhóm và tóm tắt dữ liệu nhưng sự đa dạng của các tùy chọn này có thể là một phước lành và một lời nguyền. Các cách tiếp cận này là tất cả các công cụ phân tích dữ liệu mạnh mẽ nhưng có thể khó hiểu khi biết nên sử dụng một
import pandas as pd import seaborn as sns7,
import pandas as pd import seaborn as sns8 hoặc
import pandas as pd import seaborn as sns9 để xây dựng bảng tóm tắt. Vì trước đây tôi đã đề cập đến Pivot_Tables, bài viết này sẽ thảo luận về chức năng Pandas
import pandas as pd import seaborn as sns9, giải thích việc sử dụng nó và minh họa cách nó có thể được sử dụng để nhanh chóng tóm tắt dữ liệu. Mục tiêu của tôi là có bài viết này là một tài nguyên mà bạn có thể đánh dấu và tham khảo khi bạn cần nhắc nhở bản thân những gì bạn có thể làm với chức năng
import pandas as pd import seaborn as sns9.
Tổng quan
Hàm pandas crosstab xây dựng một bảng phân loại chéo có thể hiển thị tần số mà các nhóm dữ liệu nhất định xuất hiện. Ví dụ nhanh, bảng này hiển thị số lượng hai hoặc bốn xe cửa được sản xuất bởi các nhà sản xuất xe hơi khác nhau: các nhà sản xuất:
5 | 8 | 13 |
7 | 9 | 16 |
4 | 9 | 13 |
9 | 9 | 18 |
9 | 3 | 12 |
18 | 14 | 32 |
8 | 4 | 12 |
11 | 0 | 11 |
71 | 56 | 127 |
làm
Honda
Mazda
Mitsubishi
import pandas as pd import seaborn as sns
NissanUCI Machine Learning Repository and make some label changes for clarity:
# Define the headers since the data does not have any headers = ["symboling", "normalized_losses", "make", "fuel_type", "aspiration", "num_doors", "body_style", "drive_wheels", "engine_location", "wheel_base", "length", "width", "height", "curb_weight", "engine_type", "num_cylinders", "engine_size", "fuel_system", "bore", "stroke", "compression_ratio", "horsepower", "peak_rpm", "city_mpg", "highway_mpg", "price"] # Read in the CSV file and convert "?" to NaN df_raw = pd.read_csv["//mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data", header=None, names=headers, na_values="?" ] # Define a list of models that we want to review models = ["toyota","nissan","mazda", "honda", "mitsubishi", "subaru", "volkswagen", "volvo"] # Create a copy of the data with only the top 8 manufacturers df = df_raw[df_raw.make.isin[models]].copy[]
Subaru
Toyota
pd.crosstab[df.make, df.body_style]
0 | 0 | 7 | 5 | 1 |
0 | 0 | 10 | 7 | 0 |
0 | 0 | 9 | 4 | 0 |
0 | 1 | 5 | 9 | 3 |
0 | 0 | 3 | 5 | 4 |
1 | 3 | 14 | 10 | 4 |
1 | 0 | 1 | 9 | 1 |
0 | 0 | 0 | 8 | 3 |
Trong bảng trên, bạn có thể thấy rằng bộ dữ liệu chứa 32 chiếc xe Toyota trong đó 18 là bốn cửa và 14 là hai cửa. Đây là một bảng tương đối đơn giản để giải thích và minh họa lý do tại sao phương pháp này có thể là một cách mạnh mẽ để tóm tắt dữ liệu lớn & NBSP; bộ.
Pandas làm cho quá trình này dễ dàng và cho phép chúng tôi tùy chỉnh các bảng trong một số cách cư xử khác nhau. Trong phần còn lại của bài viết, tôi sẽ đi qua cách tạo và tùy chỉnh các bảng & nbsp;
Đầu tiên, chúng ta có thể sử dụng
import pandas as pd import seaborn as sns7 theo sau là
# Define the headers since the data does not have any headers = ["symboling", "normalized_losses", "make", "fuel_type", "aspiration", "num_doors", "body_style", "drive_wheels", "engine_location", "wheel_base", "length", "width", "height", "curb_weight", "engine_type", "num_cylinders", "engine_size", "fuel_system", "bore", "stroke", "compression_ratio", "horsepower", "peak_rpm", "city_mpg", "highway_mpg", "price"] # Read in the CSV file and convert "?" to NaN df_raw = pd.read_csv["//mlr.cs.umass.edu/ml/machine-learning-databases/autos/imports-85.data", header=None, names=headers, na_values="?" ] # Define a list of models that we want to review models = ["toyota","nissan","mazda", "honda", "mitsubishi", "subaru", "volkswagen", "volvo"] # Create a copy of the data with only the top 8 manufacturers df = df_raw[df_raw.make.isin[models]].copy[]8 để có được cùng & nbsp; Kết quả:
df.groupby[['make', 'body_style']]['body_style'].count[].unstack[].fillna[0]
Đầu ra cho ví dụ này trông rất giống với crosstab nhưng phải mất một vài bước bổ sung để có được nó được định dạng & nbsp; chính xác.
Cũng có thể làm điều gì đó tương tự bằng cách sử dụng
import pandas as pd import seaborn as sns8:
df.pivot_table[index='make', columns='body_style', aggfunc={'body_style':len}, fill_value=0]
Đảm bảo xem lại bài viết trước của tôi trên PIVOT_TABLES nếu bạn muốn hiểu cách thức này & NBSP;
Câu hỏi vẫn còn, tại sao thậm chí sử dụng chức năng crosstab? Câu trả lời ngắn gọn là nó cung cấp một vài hàm tiện dụng để dễ dàng định dạng và tóm tắt dữ liệu & nbsp;
Câu trả lời dài hơn là đôi khi có thể khó nhớ tất cả các bước để thực hiện điều này. API Crosstab đơn giản là con đường nhanh nhất đến giải pháp và cung cấp một số phím tắt hữu ích cho một số loại & nbsp; phân tích.API is the quickest route to the solution and provides some useful shortcuts for certain types of analysis.
Theo kinh nghiệm của tôi, điều quan trọng là phải biết về các tùy chọn và sử dụng cái chảy tự nhiên nhất từ phân tích. Tôi đã có những trải nghiệm khi tôi cố gắng cố gắng tạo ra một giải pháp pivot_table và sau đó nhanh chóng có được thứ tôi muốn bằng cách sử dụng crosstab. Điều tuyệt vời về gấu trúc là một khi dữ liệu nằm trong DataFrame, tất cả các thao tác này là 1 dòng mã để bạn được tự do & nbsp; thử nghiệm.
Lặn sâu hơn vào & nbsp; crosstab
Bây giờ chúng tôi đã đi qua quy trình crosstab cơ bản, tôi sẽ giải thích một số thay đổi hữu ích khác mà bạn có thể thực hiện đối với đầu ra bằng cách thay đổi các tham số & nbsp;
Một nhu cầu phổ biến trong crosstab là bao gồm các phụ. Chúng tôi có thể thêm chúng bằng từ khóa
pd.crosstab[df.make, df.body_style]0:
pd.crosstab[df.make, df.num_doors, margins=True, margins_name="Total"]
5 | 8 | 13 |
7 | 9 | 16 |
4 | 9 | 13 |
9 | 9 | 18 |
9 | 3 | 12 |
18 | 14 | 32 |
8 | 4 | 12 |
11 | 0 | 11 |
71 | 56 | 127 |
làm
Honda
pd.crosstab[df.make, df.body_style, values=df.curb_weight, aggfunc='mean'].round[0]
Mazda | Mazda | 1970.0 | 2289.0 | 2024.0 |
Mazda | Mazda | 2254.0 | 2361.0 | Mazda |
Mazda | Mazda | 2377.0 | 2394.0 | Mazda |
Mazda | 2008.0 | 2740.0 | 2238.0 | 2452.0 |
Mazda | Mazda | 2137.0 | 2314.0 | 2454.0 |
2975.0 | 2585.0 | 2370.0 | 2338.0 | 2708.0 |
2254.0 | Mazda | 2221.0 | 2342.0 | 2563.0 |
Mazda | Mazda | Mazda | 3023.0 | 3078.0 |
Mitsubishi
Nissan
pd.crosstab[df.make, df.body_style, normalize=True]
0.000000 | 0.000000 | 0.054688 | 0.039062 | 0.007812 |
0.000000 | 0.000000 | 0.078125 | 0.054688 | 0.000000 |
0.000000 | 0.000000 | 0.070312 | 0.031250 | 0.000000 |
0.000000 | 0.007812 | 0.039062 | 0.070312 | 0.023438 |
0.000000 | 0.000000 | 0.023438 | 0.039062 | 0.031250 |
0.007812 | 0.023438 | 0.109375 | 0.078125 | 0.031250 |
0.007812 | 0.000000 | 0.007812 | 0.070312 | 0.007812 |
0.000000 | 0.000000 | 0.000000 | 0.062500 | 0.023438 |
Từ khóa
pd.crosstab[df.make, df.body_style]0 đã hướng dẫn gấu trúc để thêm tổng số cho mỗi hàng cũng như tổng số ở phía dưới. Tôi cũng đã chuyển một giá trị cho
pd.crosstab[df.make, df.body_style]2 trong cuộc gọi chức năng vì tôi muốn gắn nhãn kết quả là tổng số thay vì mặc định & nbsp;
Tất cả các ví dụ này chỉ đơn giản là đếm các lần xuất hiện riêng lẻ của các kết hợp dữ liệu.
import pandas as pd import seaborn as sns9 cho phép chúng tôi thực hiện tóm tắt nhiều hơn bằng cách bao gồm các giá trị để tổng hợp. Để minh họa điều này, chúng ta có thể tính toán trọng lượng trung bình của xe hơi theo phong cách cơ thể và & nbsp; nhà sản xuất: nhà sản xuất:
pd.crosstab[df.make, df.body_style, normalize='columns']
0.0 | 0.00 | 0.142857 | 0.087719 | 0.0625 |
0.0 | 0.00 | 0.204082 | 0.122807 | 0.0000 |
0.0 | 0.00 | 0.183673 | 0.070175 | 0.0000 |
0.0 | 0.25 | 0.102041 | 0.157895 | 0.1875 |
0.0 | 0.00 | 0.061224 | 0.087719 | 0.2500 |
0.5 | 0.75 | 0.285714 | 0.175439 | 0.2500 |
0.5 | 0.00 | 0.020408 | 0.157895 | 0.0625 |
0.0 | 0.00 | 0.000000 | 0.140351 | 0.1875 |
Từ khóa
pd.crosstab[df.make, df.body_style]0 đã hướng dẫn gấu trúc để thêm tổng số cho mỗi hàng cũng như tổng số ở phía dưới. Tôi cũng đã chuyển một giá trị cho
pd.crosstab[df.make, df.body_style]2 trong cuộc gọi chức năng vì tôi muốn gắn nhãn kết quả là tổng số thay vì mặc định & nbsp;
Chúng ta có thể làm điều tương tự & nbsp; hàng khôn ngoan:
import pandas as pd import seaborn as sns0
0.000000 | 0.000000 | 0.538462 | 0.384615 | 0.076923 |
0.000000 | 0.000000 | 0.588235 | 0.411765 | 0.000000 |
0.000000 | 0.000000 | 0.692308 | 0.307692 | 0.000000 |
0.000000 | 0.055556 | 0.277778 | 0.500000 | 0.166667 |
0.000000 | 0.000000 | 0.250000 | 0.416667 | 0.333333 |
0.031250 | 0.093750 | 0.437500 | 0.312500 | 0.125000 |
0.083333 | 0.000000 | 0.083333 | 0.750000 | 0.083333 |
0.000000 | 0.000000 | 0.000000 | 0.727273 | 0.272727 |
Quan điểm này về dữ liệu cho thấy rằng những chiếc xe Mitsubishi trong bộ dữ liệu này, 69,23% là hatchback và phần còn lại [30,77%] là & nbsp; mui trần.
Tôi hy vọng bạn sẽ đồng ý rằng các phím tắt này có thể hữu ích trong nhiều loại & nbsp; phân tích.
Nhóm
Một trong những tính năng hữu ích nhất của Crosstab là bạn có thể vượt qua nhiều cột DataFrame và Pandas thực hiện tất cả các nhóm cho bạn. Chẳng hạn, nếu chúng ta muốn xem dữ liệu được phân phối bằng ổ đĩa bánh trước [FWD] và ổ bánh sau [RWD] như thế nào, chúng ta có thể bao gồm cột Drive_Wheels bằng cách đưa nó vào danh sách các cột hợp lệ trong đối số thứ hai cho
import pandas as pd import seaborn as sns9 .
import pandas as pd import seaborn as sns1
0 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 5 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 6 | 4 | 0 | 5 | 2 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 9 | 0 | 0 | 4 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 2 | 3 | 0 | 9 | 0 | 0 | 3 | 0 |
0 | 0 | 0 | 0 | 1 | 2 | 0 | 2 | 3 | 0 | 2 | 2 | 0 |
0 | 1 | 0 | 3 | 0 | 8 | 6 | 0 | 7 | 3 | 2 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 9 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 0 | 0 | 3 |
Quan điểm này về dữ liệu cho thấy rằng những chiếc xe Mitsubishi trong bộ dữ liệu này, 69,23% là hatchback và phần còn lại [30,77%] là & nbsp; mui trần.
import pandas as pd import seaborn as sns2
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 4 | 2 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 4 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 5 | 0 | 0 | 3 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 3 | 0 | 4 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 3 | 0 | 2 | 2 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | 0 | 0 | 7 | 1 | 2 | 1 | 1 |
0 | 0 | 1 | 0 | 0 | 3 | 0 | 2 | 6 | 0 | 0 | 2 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 0 | 0 | 3 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Nissan
Subaru
Toyota
Volkswagen
Volvo
Quan điểm này về dữ liệu cho thấy rằng những chiếc xe Mitsubishi trong bộ dữ liệu này, 69,23% là hatchback và phần còn lại [30,77%] là & nbsp; mui trần.
Tôi hy vọng bạn sẽ đồng ý rằng các phím tắt này có thể hữu ích trong nhiều loại & nbsp; phân tích.
import pandas as pd import seaborn as sns3
Nhóm
Một trong những tính năng hữu ích nhất của Crosstab là bạn có thể vượt qua nhiều cột DataFrame và Pandas thực hiện tất cả các nhóm cho bạn. Chẳng hạn, nếu chúng ta muốn xem dữ liệu được phân phối bằng ổ đĩa bánh trước [FWD] và ổ bánh sau [RWD] như thế nào, chúng ta có thể bao gồm cột Drive_Wheels bằng cách đưa nó vào danh sách các cột hợp lệ trong đối số thứ hai cho
import pandas as pd import seaborn as sns9 .
Cheat Sheet
FWDPDF version here.
RWD
Chúng ta cũng có thể làm điều tương tự với & nbsp; index: