R&Python Data Science 系列:數據處理(3)
- 2019 年 11 月 10 日
- 筆記
承接上面內容,本部分將剩餘函數介紹完整。
R&Python Data Science 系列:數據處理(2)
R&Python Data Science 系列:數據處理(1)
1 重塑函數
這裡只介紹arrange()和rename()兩個函數。
1.1 arrange函數
排序函數,按照某(幾)個指定的列按照升(降)序排列重新排列數據集,參數ascending = False,降序排列,ascending = True,升序排列;
Python實現
from dfply import * import numpy as np import pandas as pd ###按照price升序排列 diamonds >> arrange(X.price, ascending = True) >> head(4)

###按照price降序排列 diamonds >> arrange(X.price, ascending = False) >> head(4)

R實現
library(tidyverse) library(ggplot2) library(dplyr) ##按照price升序排列 diamonds %>% arrange(price) %>% head(4) ##按照price降序排列 diamonds %>% arrange(desc(price)) %>% head(4)

注意:Python排列順序使用參數ascending控制;R語言中使用desc函數;
1.2 rename函數
重命名函數,Python和R語言中使用方法相同,new_name = old_name:
Python實現
###將cut重命名為CUT diamonds >> rename(CUT = X.cut) >> head(5)

R實現
###將cut重命名為CUT diamonds %>% rename(CUT = cut) %>% head(5)

2 匯總函數
Python中匯總函數主要有summarize()和summarize_each()函數,這裡的"匯總"翻譯成概括更加合適,summarize()和summarize_each()區別在於:對某(幾)列作用幾個函數,summarize()需要幾個函數依次作用於對應的列,而summarize_each()將幾個函數以列表形式作為第一個參數,作用於後面的列:
Python實現
###計算鑽石價格price的最大值、最小值 diamonds >> summarize(price_max = X.price.max(), price_min = X.price.min()) >> head(4)

###計算x、y、z的最大值和最小值 diamonds >> summarize_each([np.max, np.min], X.x, X.y, X.z) >> head(4)

R實現
##計算鑽石價格price的最大值、最小值 diamonds %>% summarise(price_max = max(price), price_min=min(price)) ###計算鑽石x、y、z的最大值、最小值 diamonds %>% select(x, y, z) %>% summarise_all(list(min, max))

注意:R語言中沒有summarise_each(),但是summarise_all()有相同的處理方式。
3 窗口函數
窗口函數,是對某列操作,返回長度相同的一列,主要包括排名函數、偏移函數、累計聚合函數。R語言中窗口函數可以查看:
3.1 排名函數
Python中排名函數主要有row_number()、min_rank()、dense_rank(),R語言也是這個3個函數,函數名都是相同的,用法也完全相同。在某種分組排序規則之後,row_number()生成一個連續不重複的編碼,min_rank()生成一個不連續的編碼,但是對相同的記錄編碼相同,而dense_rank()生成一個連續的編碼,相同記錄有相同的編碼:
Python實現
##新增一列排序,row_number diamonds >> select(X.price) >> mutate(price_rn = row_number(X.price)) >> head(6)

#新增一列排序,min_rank diamonds >> select(X.price) >> mutate(price_mrank = min_rank(X.price)) >> head(6)

#新增一列排序,dense_rank diamonds >> select(X.price) >> mutate(price_drank = dense_rank(X.price)) >> head(6)

R實現
#新增一列排序,row_number diamonds %>% select(price) %>% mutate(price_rn = row_number(price)) %>% head(6) #新增一列排序,min_rank diamonds %>% select(price) %>% mutate(price_mrank = min_rank(price)) %>% head(6) #新增一列排序,dense_rank diamonds %>% select(price) %>% mutate(price_drank = dense_rank(price)) %>% head(6)

3.2 偏移函數
兩個偏移函數lead()和lag():
lead(column,n):按照某種分組排序規則之後,向下取某列數據的第n行記錄
lag(column,n):按照某種分組排序規則之後,向上取某列數據的第n行記錄
Python實現
(diamonds >> arrange(X.price) >> select(X.price) >> mutate(price_lead1 = lead(X.price,1), price_lead2 = lead(X.price,2), price_lag1 = lag(X.price,1), price_lag2 = lag(X.price,2)) >> head(5))

R實現
diamonds %>% arrange(price) %>% select(price) %>% mutate(price_lead1 = lead(price,1), price_lead2 = lead(price,2), price_lag1 = lag(price,1), price_lag2 = lag(price,2)) %>% head(5)

3.3 累計聚合函數
累計聚合函數主要包括cumsum()、cummean()、cummax()、cummin()以及cumprod(),都是在某種排序規則下,函數作用於第一行記錄,結果記在第一行,函數作用於前兩行記錄,結果記錄在第二行,函數作用於前三行記錄,結果記錄在第三行…
Python實現
(diamonds >> select(X.price) >> head(6) >> mutate(price_cumsum = cumsum(X.price), price_cummean = cummean(X.price), price_cummax = cummax(X.price), price_cummin = cummin(X.price), price_cumprod = cumprod(X.price)))

R實現
diamonds %>% select(price) %>% head(6) %>% mutate(price_cumsum = cumsum(price), price_cummean = cummean(price), price_cummax = cummax(price), price_cummin = cummin(price), price_cumprod = cumprod(price))

4 聚合函數
聚合函數是對某一列數據,使用分組函數和排序函數進行處理之後(可以省略),使用聚合函數,返回一個值。主要有first()、last()、nth()、n()以及n_distinct():
first(column):按照某種規則分組排序後(可選),取第一行數據記錄
last(column):按照某種規則分組排序後(可選),取最後一行數據記錄
nth(column,n):按照某種規則分組排序後(可選),取第n行的記錄
n():按照某種規則分組排序後(可選),count計數,不去重
n_distinct():按照某種規則分組排序後(可選),count計數,去重

Python實現
##聚合函數 (diamonds >> head(6) >> select(X.price) >> summarise(price_first = first(X.price), price_last = last(X.price),price_nthprice = nth(X.price,3), price_n = n(X.price), price_disn = n_distinct(X.price)))

R實現
#聚合函數 diamonds %>% head(6) %>% select(price) %>% summarise(price_first = first(price), price_last = last(price), price_nthprice = nth(price,3), price_n = n(), price_disn = n_distinct(price))

注意:Python中n()函數需要傳入參數,R中不需要傳入參數;Python中輸出列按照字段名稱升序排列,R中輸出的列按照書寫順序輸出。
5 總結
數據處理1-3,主要介紹了Python中dfply和R中dplyr包中的數據處理函數,幾乎滿足數據預處理中篩選變量、衍生變量以及計算一些統計量的需求。