So sánh dplyr và pandas cho data manipulation
Package dplyr
là một trong những thành phần rất quan trọng trong hệ sinh thái tidyverse
của Hadley Wickham - tác giả của các thư viện nổi tiếng trên R như ggplot2, readr, tidyr,…dplyr
cung cấp các công cụ biến đổi giúp cho việc thao tác với dữ liệu trên R dễ dàng và thuận tiện hơn bao giờ hết. Kết hợp với toán tử %>%
, nhiều người cho rằng dplyr đã tạo ra concept
mới cho R.
Để thực hiện các công việc liên quan đến data manipulation chúng ta có thể sử dụng các hàm thuộc gói base
trong R, tuy nhiêu cú phát của nhiều hàm base
là không nhất quán và khó nhớ, đặc biệt là cho một nhóm công việc đặc biệt tốn thời gian như là data manipulation. Gói hay còn thường được gọi là hệ sinh thái tidyverse
ra đời nhằm đáp ứng các nhu cầu ngày càng tăng của việc biến đổi và làm sạch dữ liệu (data cleaning), nó bao gồm tập hợp của những gói mạnh nhất chuyên cho công việc làm sạch và biến đổi dữ liệu. Ưu điểm của việc sử dụng tidyverse
phải kể đến các lí do sau:
- Dễ hiểu và có cú pháp nhất quán.
- Hợp nhất và hỗ trợ
ggplot2
- một gói chuyên cho data visualization. - Có thể phân tích, quản lí cơ sở dữ liệu ngoài (external databases) mà không cần biết sâu các chi tiết và kiến thức của các ngôn ngữ truy vấn cơ sở dữ liệu (database query languages) khác như
SQL
.
Nạp gói tidyverse
vào phiên làm việc trên R để thực hiện công việc data manipulation:
# R
library(tidyverse)
Tidyverse
là một hộp công cụ lớn chứa nhiều package nhỏ (trong đó có dplyr
) bên trong và các mảnh nhỏ này kết nối với nhau một cách tiện ích để vận hành một quy trình phân tích dữ liệu hoàn chỉnh. Hiện nay tidyverse
chứa 27 packages bao gồm:
# R
tidyverse_packages()
## [1] "broom" "cli" "crayon" "dbplyr" "dplyr"
## [6] "forcats" "ggplot2" "haven" "hms" "httr"
## [11] "jsonlite" "lubridate" "magrittr" "modelr" "pillar"
## [16] "purrr" "readr" "readxl" "reprex" "rlang"
## [21] "rstudioapi" "rvest" "stringr" "tibble" "tidyr"
## [26] "xml2" "tidyverse"
Trong post này chúng ta hãy cùng so sánh các thao tác data manipulation thường dùng trong data science bằng cách sử dụng R (với dplyr
) và sử dụng Python (với pandas
):
filter:
Lọc dữ liệu với các điều kiện của biến (thuộc tính)select:
Chọn thuộc tính hay là tập hợp các thuộc tínharrange:
Sắp xếp dữ liệu theo thứ tmutate
: Tạo thuộc tính mới cho data frameựsummarise:
Thống kê mô tả theo phân nhóm
Nạp thư viện reticulate
:
# R
library(reticulate)
reticulate
cho phép chúng ta sử dụng kết hợp R và Python trong môi trường R. Cụ thể về cách sử dụng thư viện này để kết hợp R và Python tôi đã giới thiệu ở post trước, các bạn có thể đọc ở đây
Nạp thư viện pandas
trong môi trường R:
# Python
import pandas as pd
Chú ý: Những R code chunks tôi sẽ comment R
và Python là Python
.
Cũng giống như dplyr
trong R, về cơ bản Pandas
là một thư viện mã nguồn mở, được cộng đồng đánh giá là high-performance, nó hỗ trợ đắc lực trong thao tác với dữ liệu và giúp cho việc xử lý dữ liệu, tính toán sẽ dễ dàng hơn rất nhiều cách truyền thống trong Python.
Load dữ liệu để demo:
# R
# Nạp R built-in dataset mtcars
data(mtcars)
# Chuyển dữ dữ liệu về dạng tibble(hay còn gọi là data_frame) - đây là 1
# kiểu cấu trúc dữ liệu mới trong R nhằm đáp ứng nhu cầu về tốc độ tính toán
# khi xử lí dữ liệu có kích thước lớn
data_r <- as_tibble(mtcars)
data_r
## # A tibble: 32 x 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ... with 22 more rows
So sánh dplyr
và pandas
1. Filter dữ liệu theo điều kiện của thuộc tính
# R
filter(data_r, cyl >=6 & am == 1)
## # A tibble: 5 x 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
## 4 19.7 6 145 175 3.62 2.77 15.5 0 1 5 6
## 5 15 8 301 335 3.54 3.57 14.6 0 1 5 8
# Python
# chuyển dữ liệu từ R cho Python:
data_py = r.data_r
data_py[(data_py['cyl'] >=6) & (data_py['am'] == 1)]
## mpg cyl disp hp drat wt qsec vs am gear carb
## 0 21.0 6.0 160.0 110.0 3.90 2.620 16.46 0.0 1.0 4.0 4.0
## 1 21.0 6.0 160.0 110.0 3.90 2.875 17.02 0.0 1.0 4.0 4.0
## 28 15.8 8.0 351.0 264.0 4.22 3.170 14.50 0.0 1.0 5.0 4.0
## 29 19.7 6.0 145.0 175.0 3.62 2.770 15.50 0.0 1.0 5.0 6.0
## 30 15.0 8.0 301.0 335.0 3.54 3.570 14.60 0.0 1.0 5.0 8.0
# R
data_r %>% filter(am != 0)
## # A tibble: 13 x 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 5 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 6 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## 7 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
## 8 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
## 9 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
## 10 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
## 11 19.7 6 145 175 3.62 2.77 15.5 0 1 5 6
## 12 15 8 301 335 3.54 3.57 14.6 0 1 5 8
## 13 21.4 4 121 109 4.11 2.78 18.6 1 1 4 2
# Python
data_py[data_py['am'] != 0]
## mpg cyl disp hp drat wt qsec vs am gear carb
## 0 21.0 6.0 160.0 110.0 3.90 2.620 16.46 0.0 1.0 4.0 4.0
## 1 21.0 6.0 160.0 110.0 3.90 2.875 17.02 0.0 1.0 4.0 4.0
## 2 22.8 4.0 108.0 93.0 3.85 2.320 18.61 1.0 1.0 4.0 1.0
## 17 32.4 4.0 78.7 66.0 4.08 2.200 19.47 1.0 1.0 4.0 1.0
## 18 30.4 4.0 75.7 52.0 4.93 1.615 18.52 1.0 1.0 4.0 2.0
## 19 33.9 4.0 71.1 65.0 4.22 1.835 19.90 1.0 1.0 4.0 1.0
## 25 27.3 4.0 79.0 66.0 4.08 1.935 18.90 1.0 1.0 4.0 1.0
## 26 26.0 4.0 120.3 91.0 4.43 2.140 16.70 0.0 1.0 5.0 2.0
## 27 30.4 4.0 95.1 113.0 3.77 1.513 16.90 1.0 1.0 5.0 2.0
## 28 15.8 8.0 351.0 264.0 4.22 3.170 14.50 0.0 1.0 5.0 4.0
## 29 19.7 6.0 145.0 175.0 3.62 2.770 15.50 0.0 1.0 5.0 6.0
## 30 15.0 8.0 301.0 335.0 3.54 3.570 14.60 0.0 1.0 5.0 8.0
## 31 21.4 4.0 121.0 109.0 4.11 2.780 18.60 1.0 1.0 4.0 2.0
# R
data_r %>% group_by(cyl) %>% filter(sum(hp) > 2000)
## # A tibble: 14 x 11
## # Groups: cyl [1]
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 2 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 3 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
## 4 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
## 5 15.2 8 276. 180 3.07 3.78 18 0 0 3 3
## 6 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4
## 7 10.4 8 460 215 3 5.42 17.8 0 0 3 4
## 8 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4
## 9 15.5 8 318 150 2.76 3.52 16.9 0 0 3 2
## 10 15.2 8 304 150 3.15 3.44 17.3 0 0 3 2
## 11 13.3 8 350 245 3.73 3.84 15.4 0 0 3 4
## 12 19.2 8 400 175 3.08 3.84 17.0 0 0 3 2
## 13 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4
## 14 15 8 301 335 3.54 3.57 14.6 0 1 5 8
# Python
data_py.groupby('cyl').filter(lambda x: sum(x['hp']) > 2000)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 4 18.7 8.0 360.0 175.0 3.15 3.440 17.02 0.0 0.0 3.0 2.0
## 6 14.3 8.0 360.0 245.0 3.21 3.570 15.84 0.0 0.0 3.0 4.0
## 11 16.4 8.0 275.8 180.0 3.07 4.070 17.40 0.0 0.0 3.0 3.0
## 12 17.3 8.0 275.8 180.0 3.07 3.730 17.60 0.0 0.0 3.0 3.0
## 13 15.2 8.0 275.8 180.0 3.07 3.780 18.00 0.0 0.0 3.0 3.0
## 14 10.4 8.0 472.0 205.0 2.93 5.250 17.98 0.0 0.0 3.0 4.0
## 15 10.4 8.0 460.0 215.0 3.00 5.424 17.82 0.0 0.0 3.0 4.0
## 16 14.7 8.0 440.0 230.0 3.23 5.345 17.42 0.0 0.0 3.0 4.0
## 21 15.5 8.0 318.0 150.0 2.76 3.520 16.87 0.0 0.0 3.0 2.0
## 22 15.2 8.0 304.0 150.0 3.15 3.435 17.30 0.0 0.0 3.0 2.0
## 23 13.3 8.0 350.0 245.0 3.73 3.840 15.41 0.0 0.0 3.0 4.0
## 24 19.2 8.0 400.0 175.0 3.08 3.845 17.05 0.0 0.0 3.0 2.0
## 28 15.8 8.0 351.0 264.0 4.22 3.170 14.50 0.0 1.0 5.0 4.0
## 30 15.0 8.0 301.0 335.0 3.54 3.570 14.60 0.0 1.0 5.0 8.0
2. Select thuộc tính
# R
head(select(data_r, cyl, hp, wt), 5)
## # A tibble: 5 x 3
## cyl hp wt
## <dbl> <dbl> <dbl>
## 1 6 110 2.62
## 2 6 110 2.88
## 3 4 93 2.32
## 4 6 110 3.22
## 5 8 175 3.44
# Python
data_py[['cyl', 'hp', 'wt']].head(5)
## cyl hp wt
## 0 6.0 110.0 2.620
## 1 6.0 110.0 2.875
## 2 4.0 93.0 2.320
## 3 6.0 110.0 3.215
## 4 8.0 175.0 3.440
# R
head(select(data_r, -mpg), 5)
## # A tibble: 5 x 10
## cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 8 360 175 3.15 3.44 17.0 0 0 3 2
# Python
data_py.drop('mpg', 1).head(5)
## cyl disp hp drat wt qsec vs am gear carb
## 0 6.0 160.0 110.0 3.90 2.620 16.46 0.0 1.0 4.0 4.0
## 1 6.0 160.0 110.0 3.90 2.875 17.02 0.0 1.0 4.0 4.0
## 2 4.0 108.0 93.0 3.85 2.320 18.61 1.0 1.0 4.0 1.0
## 3 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
## 4 8.0 360.0 175.0 3.15 3.440 17.02 0.0 0.0 3.0 2.0
3.Sắp Xếp dữ liệu theo thứ tự
# R
# Sắp xếp dữ liệu theo giá trị tăng dần của cột cyl
arrange(data_r, cyl)
## # A tibble: 32 x 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 2 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 3 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 4 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 5 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 6 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## 7 21.5 4 120. 97 3.7 2.46 20.0 1 0 3 1
## 8 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
## 9 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
## 10 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
## # ... with 22 more rows
# Python
data_py.sort_values('cyl').head(10)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 31 21.4 4.0 121.0 109.0 4.11 2.780 18.60 1.0 1.0 4.0 2.0
## 2 22.8 4.0 108.0 93.0 3.85 2.320 18.61 1.0 1.0 4.0 1.0
## 27 30.4 4.0 95.1 113.0 3.77 1.513 16.90 1.0 1.0 5.0 2.0
## 26 26.0 4.0 120.3 91.0 4.43 2.140 16.70 0.0 1.0 5.0 2.0
## 25 27.3 4.0 79.0 66.0 4.08 1.935 18.90 1.0 1.0 4.0 1.0
## 20 21.5 4.0 120.1 97.0 3.70 2.465 20.01 1.0 0.0 3.0 1.0
## 7 24.4 4.0 146.7 62.0 3.69 3.190 20.00 1.0 0.0 4.0 2.0
## 8 22.8 4.0 140.8 95.0 3.92 3.150 22.90 1.0 0.0 4.0 2.0
## 19 33.9 4.0 71.1 65.0 4.22 1.835 19.90 1.0 1.0 4.0 1.0
## 18 30.4 4.0 75.7 52.0 4.93 1.615 18.52 1.0 1.0 4.0 2.0
# R
# Sắp xếp dữ liệu theo giá trị giảm dần của cột cyl
arrange(data_r, desc(cyl))
## # A tibble: 32 x 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 2 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 3 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
## 4 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
## 5 15.2 8 276. 180 3.07 3.78 18 0 0 3 3
## 6 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4
## 7 10.4 8 460 215 3 5.42 17.8 0 0 3 4
## 8 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4
## 9 15.5 8 318 150 2.76 3.52 16.9 0 0 3 2
## 10 15.2 8 304 150 3.15 3.44 17.3 0 0 3 2
## # ... with 22 more rows
# Python
data_py.sort_values('cyl', ascending=False).head(10)
## mpg cyl disp hp drat wt qsec vs am gear carb
## 16 14.7 8.0 440.0 230.0 3.23 5.345 17.42 0.0 0.0 3.0 4.0
## 30 15.0 8.0 301.0 335.0 3.54 3.570 14.60 0.0 1.0 5.0 8.0
## 4 18.7 8.0 360.0 175.0 3.15 3.440 17.02 0.0 0.0 3.0 2.0
## 28 15.8 8.0 351.0 264.0 4.22 3.170 14.50 0.0 1.0 5.0 4.0
## 6 14.3 8.0 360.0 245.0 3.21 3.570 15.84 0.0 0.0 3.0 4.0
## 24 19.2 8.0 400.0 175.0 3.08 3.845 17.05 0.0 0.0 3.0 2.0
## 23 13.3 8.0 350.0 245.0 3.73 3.840 15.41 0.0 0.0 3.0 4.0
## 22 15.2 8.0 304.0 150.0 3.15 3.435 17.30 0.0 0.0 3.0 2.0
## 21 15.5 8.0 318.0 150.0 2.76 3.520 16.87 0.0 0.0 3.0 2.0
## 11 16.4 8.0 275.8 180.0 3.07 4.070 17.40 0.0 0.0 3.0 3.0
4. Tạo thuộc tính mới
# R
# Tạo và thêm biến mới có tên cyl2
mutate(data_r, cyl2 = mean(cyl))
## # A tibble: 32 x 12
## mpg cyl disp hp drat wt qsec vs am gear carb cyl2
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 6.19
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 6.19
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 6.19
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 6.19
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 6.19
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 6.19
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 6.19
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 6.19
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 6.19
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 6.19
## # ... with 22 more rows
# Python
import numpy as np
data_py.assign(cyl2 = lambda x: np.mean(x.cyl)).head(10)
## mpg cyl disp hp drat wt qsec vs am gear carb cyl2
## 0 21.0 6.0 160.0 110.0 3.90 2.620 16.46 0.0 1.0 4.0 4.0 6.1875
## 1 21.0 6.0 160.0 110.0 3.90 2.875 17.02 0.0 1.0 4.0 4.0 6.1875
## 2 22.8 4.0 108.0 93.0 3.85 2.320 18.61 1.0 1.0 4.0 1.0 6.1875
## 3 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0 6.1875
## 4 18.7 8.0 360.0 175.0 3.15 3.440 17.02 0.0 0.0 3.0 2.0 6.1875
## 5 18.1 6.0 225.0 105.0 2.76 3.460 20.22 1.0 0.0 3.0 1.0 6.1875
## 6 14.3 8.0 360.0 245.0 3.21 3.570 15.84 0.0 0.0 3.0 4.0 6.1875
## 7 24.4 4.0 146.7 62.0 3.69 3.190 20.00 1.0 0.0 4.0 2.0 6.1875
## 8 22.8 4.0 140.8 95.0 3.92 3.150 22.90 1.0 0.0 4.0 2.0 6.1875
## 9 19.2 6.0 167.6 123.0 3.92 3.440 18.30 1.0 0.0 4.0 4.0 6.1875
5. Thống kê mô tả theo phân nhóm
# R
data_r %>%
group_by(cyl, am) %>%
summarise(mean_cyl = mean(cyl),
sum_cyl = sum(cyl),
count_cyl = n())
## `summarise()` regrouping output by 'cyl' (override with `.groups` argument)
## # A tibble: 6 x 5
## # Groups: cyl [3]
## cyl am mean_cyl sum_cyl count_cyl
## <dbl> <dbl> <dbl> <dbl> <int>
## 1 4 0 4 12 3
## 2 4 1 4 32 8
## 3 6 0 6 24 4
## 4 6 1 6 18 3
## 5 8 0 8 96 12
## 6 8 1 8 16 2
# Python
data_py.groupby(['cyl', 'am'])['cyl'].agg(['mean', 'sum', 'count'])
## mean sum count
## cyl am
## 4.0 0.0 4.0 12.0 3
## 1.0 4.0 32.0 8
## 6.0 0.0 6.0 24.0 4
## 1.0 6.0 18.0 3
## 8.0 0.0 8.0 96.0 12
## 1.0 8.0 16.0 2
6. Tóm tắt
Dưới đây là tóm tắt so sánh một số thao tác với dữ liệu hay dùng nhất trong Python và R
Querying, Filtering, Sampling
R | Python |
---|---|
dim(df) | df.shape |
head(df) | df.head() |
slice(df, 1:10) | df.iloc[:9] |
filter(df, col1 == 1, col2 ==1) | df.query(‘col1 == 1 & col2 == 1’) |
df[df\(col1 == 1 & df\)col2 == 1] | df[(df.col1 == 1) & (df.col2 == 1)] |
select(df, col1, col2) | df[[‘col1’, ‘col2’]] |
select(df, col1:col3) | df.loc[:, ‘col1’:‘col3’] |
select(df, -(col1:col3)) | df.drop(cols_to_drop, axis=1) |
distinct(select(df, col1)) | df[[‘col1’]].drop_duplicates() |
distinct(select(df, col1, col2)) | df[[‘col1’, ‘col2’]].drop_duplicates() |
sample_n(df, 10) | df.sample(n=10) |
sample_frac(df, 0.01) | df.sample(frac=0.01) |
Sorting
R | Python |
---|---|
arrange(df, col1, col2) | df.sort_values([‘col1’, ‘col2’]) |
arrange(df, desc(col1)) | df.sort_values(‘col1’, ascending=False) |
Grouping and Summarizing
R | Python |
---|---|
summary(df) | df.describe() |
gdf <- group_by(df, col1) | gdf = df.groupby(‘col1’) |
summarise(gdf, avg=mean(col1, na.rm=TRUE)) | df.groupby(‘col1’).agg({‘col1’: ‘mean’}) |
summarise(gdf, total=sum(col1)) | df.groupby(‘col1’).sum() |