承揽R&Python Data Science 系列产品:信息处理(1)接竭尽全力如是说余下的表达式。
1 重构表达式
主要就有三个表达式,mutate()和transmute(),三个表达式在Python和R上采用方式相同,这三个表达式这类有点儿差别:mutate()表达式留存原本大部份列,接着追加两列;transmute()只留存追加的两列:
python同时实现
from dfply import * import numpy as np import pandas as pd ##追加列x+y、x*y*z,mutate()表达式 diamonds >> mutate(x_plus_y = X.x + X.y, xyz = X.x*X.y*X.z) >> head(5) ##追加列x+y、x*y*z,transmute()表达式 diamonds >> transmute(x_plus_y = X.x + X.y, xyz = X.x*X.y*X.z) >> head(5)R词汇同时实现
library(dplyr) library(ggplot2) library(tidyr) ##追加列x+y、x*y*z,mutate()表达式 diamonds %>% mutate(x_plus_y = x + y, xyz = x*y*z) %>% head(5) ##追加列x+y、x*y*z,transmute()表达式 diamonds %>% transmute(x_plus_y = x + y, xyz = x*y*z) %>% head(5)2 前提表达式
这里如是说3个前提表达式,if_else()、case_when()、between()表达式,Python包dfply和R包dplyr中都是这3个表达式,在用法上有点儿细微差别,日常中采用最多,在构建评分卡woe赋值的时候特别好用。
2.1 if_else表达式
非A即B表达式:
Python同时实现
##如果钻石价格大于2000,则钻石等级为A,其他为A- diamonds >> mutate(price_class = if_else(X.price > 2000, A, A-)) >> distinct(X.price_class)而且if_else()表达式可以嵌套采用,不过当前提判断超过2个的时候,建议采用case_when()表达式。
##如果钻石价格大于2000,则钻石等级为A,1500-2000为A-, 1500以下为A– (diamonds >> mutate(price_class = if_else(X.price > 2000, A, if_else(X.price > 1500,A-, A–))) >> distinct(X.price_class) >>select(X.price_class))R词汇同时实现
##如果钻石价格大于2000,则钻石等级为A,其他为A- diamonds %>% mutate(price_class = if_else(price > 2000, A, A-)) %>% distinct(price_class) ##如果钻石价格大于2000,则钻石等级为A,1500-2000为A-, 1500以下为A– diamonds %>% mutate(price_class = if_else(price > 2000, A, if_else(price > 1500,A-, A–))) %>% distinct(price_class)注意:python在jupyter中采用管道表达式换行书写代码的时候需要用()把代码括起来。
2.2 case_when表达式
用于多前提赋值,评分卡Woe赋值的时候采用起来很方便。
python同时实现##如果钻石价格大于2000,则钻石等级为A,1500-2000为B, 1000-1500以下为C,1000以下为D (diamonds >> mutate(price_class = case_when([X.price > 2000, A], [X.price > 1500 , B], [X.price > 1000, C], [True, D])) >> distinct(X.price_class) >>select(X.price_class))R词汇同时实现
##如果钻石价格大于2000,则钻石等级为A,1500-2000为B, 1000-1500以下为C,1000以下为D diamonds %>% mutate(price_class = case_when(price > 2000 ~ A, price > 1500 ~ B, price > 1000 ~ C, TRUE ~ D)) %>% distinct(price_class)注意:case_when表达式在Python和R词汇中采用的时候有点儿差别,请留意。
2.3 between表达式
区间判断前提表达式,为闭区间[a,b]
python同时实现
##如果钻石价格大于2000,则钻石等级为A,1500-2000为B, 1000-1500以下为C,1000以下为D (diamonds >> mutate(price_class = case_when([X.price > 2000, A], [between(X.price,1500,2000) , B], [between(X.price,1000,1500), C], [True, D])) >> select(X.price_class) >> distinct(X.price_class))R词汇同时实现
##如果钻石价格大于2000,则钻石等级为A,1500-2000为B, 1000-1500以下为C,1000以下为D diamonds %>% mutate(price_class = case_when(price > 2000 ~ A, between(price,1500,2000) ~ B, between(price,1000,1500) ~ C, TRUE ~ D)) %>% distinct(price_class)3 bind表达式
三个表达式:bind_rows()行拼接;bind_cols()列拼接:
Python同时实现
###bind_rows()表达式 diamonds2 = diamonds >> head(2) diamonds3 = diamonds >> tail(3) diamonds2 >> bind_rows(diamonds3)R词汇同时实现
##bind_rows()表达式 diamonds2 = diamonds %>% head(2) diamonds3 = diamonds %>% tail(3) diamonds2 %>% bind_rows(diamonds3) ##bind_cols()表达式 diamonds4 = diamonds %>% select(1, carat, cut, dim(diamonds)[2]) diamonds5 = diamonds %>% select(x, y) diamonds4 %>% bind_cols(diamonds5) %>% head(5)4 连接表达式
这里主要就如是说inner_join()、left_join()和rigth_join()三个表达式
Python同时实现
a = pd.DataFrame({ x1:[A,B,C], x2:[1,2,3] }) b = pd.DataFrame({ x1:[A,B,D], x3:[True,False,True]})##inner_join表达式 a >> inner_join(b, by=x1)R词汇同时实现
a = data.frame(x1 = c(A, B, C), B = c(1, 2, 3)) b = data.frame(x1 = c(A, B, D), D = c(TRUE, FALSE, TRUE)) ##inner_join表达式 a %>% inner_join(b, by = x1) ##或者inner_join(a, b, by = x1) ##left_join表达式 a %>% left_join(b, by = x1) ##或者left_join(a, b, by = x1) ##right_join表达式 a %>% right_join(b, by = x1) ##或者rigth_join(a, b, by = x1)注意:R词汇中可以采用XXX_join(a,b,by),Python中不可以采用。