透過在網路上搜尋 R 或 Python,您會發現數以百萬計的文章和數公里的討論,主題是哪一個更好、更快、更方便地處理資料。 但不幸的是,所有這些文章和爭議都不是特別有用。
本文的目的是比較兩種語言最受歡迎的套件中的基本資料處理技術。 並幫助讀者快速掌握他們還不知道的東西。 對於使用 Python 編寫程式碼的人,請了解如何在 R 中執行相同的操作,反之亦然。
在本文中,我們將分析 R 中最受歡迎的套件的語法。這些是庫中包含的套件 tidyverse
還有包包 data.table
。 並將它們的語法與 pandas
,Python 中最受歡迎的資料分析套件。
我們將逐步介紹資料分析的整個路徑,從載入資料到使用 Python 和 R 執行分析視窗函數。
Содержание
如果您忘記瞭如何在所考慮的軟體包之一中執行某些資料處理操作,本文可以用作備忘單。
R 和 Python 之間的主要語法差異
1.1.訪問包函數
1.2.任務
1.3.索引
1.4.方法和物件導向編程
1.5.管道
1.6.數據結構 關於我們將使用的包的幾句話
2.1.整潔的
2.2.數據表
2.3.大熊貓 安裝軟體包 載入資料中 建立資料框 選擇您需要的列 過濾行 分組和聚合 表的垂直聯合 (UNION) 表格的水平連接 (JOIN) 基本視窗函數和計算列 R與Python資料處理方法對應表 結論 關於您使用哪個軟體包的簡短調查
如果你對數據分析有興趣,你可以找到我的
R 和 Python 之間的主要語法差異
為了讓您更輕鬆地從Python切換到R,或者反之亦然,我將給出您需要注意的幾個要點。
訪問包函數
一旦將套件載入到 R 中,您無需指定套件名稱即可存取其功能。 在大多數情況下,這在 R 中並不常見,但這是可以接受的。 如果您在程式碼中需要某個套件的函數,則根本不必匯入該套件,只需透過指定套件的名稱和函數的名稱來呼叫它即可。 R 中套件名稱和函數名稱之間的分隔符號是雙冒號。 package_name::function_name()
.
相反,在 Python 中,透過明確指定套件的名稱來呼叫套件的函數被認為是經典的。 下載套件時,通常會給予一個縮寫名稱,例如 pandas
通常使用化名 pd
。 透過點訪問包函數 package_name.function_name()
.
任務
在 R 中,通常使用箭頭為物件賦值。 obj_name <- value
,雖然允許使用單一等號,但 R 中的單一等號主要用於將值傳遞給函數參數。
在 Python 中,賦值僅透過單一等號完成 obj_name = value
.
索引
這裡也存在相當顯著的差異。 在 R 中,索引從 XNUMX 開始,包括結果範圍中的所有指定元素,
在Python中,索引從零開始,且所選範圍不包括索引中指定的最後一個元素。 所以設計 x[i:j]
Python 中不會包含 j 元素。
負索引也有差異,以 R 表示法 x[-1]
將傳迴向量中除最後一個元素之外的所有元素。 在 Python 中,類似的表示法將只傳回最後一個元素。
方法和物件導向編程
R以自己的方式實現OOP,我在文章中寫過這一點 tydiverse
會比 pandas
。 雖然這可能是我的主觀意見。
簡而言之,R 中的物件沒有方法(如果我們談論 S3 類,但還有其他不太常見的 OOP 實作)。 只有通用函數根據物件的類別對它們進行不同的處理。
管道
也許這就是名字 pandas
它並不完全正確,但我會嘗試解釋其含義。
為了不節省中間計算,也不在工作環境中產生不必要的對象,可以使用一種管道。 那些。 將計算結果從一個函數傳遞到下一個函數,並且不保存中間結果。
讓我們看下面的程式碼範例,其中我們將中間計算儲存在單獨的物件中:
temp_object <- func1()
temp_object2 <- func2(temp_object )
obj <- func3(temp_object2 )
我們依序執行了 3 個操作,每個操作的結果都保存在一個單獨的物件中。 但事實上,我們並不需要這些中間物件。
或者更糟,但 Excel 用戶更熟悉。
obj <- func3(func2(func1()))
在這種情況下,我們沒有保存中間計算結果,但是讀取帶有巢狀函數的程式碼卻極為不方便。
我們將研究 R 中的幾種資料處理方法,它們以不同的方式執行類似的操作。
圖書館內的管道 tidyverse
由營運商實施 %>%
.
obj <- func1() %>%
func2() %>%
func3()
因此我們得到工作的結果 func1()
並將其作為第一個參數傳遞給 func2()
,然後我們將計算結果作為第一個參數傳遞 func3()
。 最後,我們將所有執行的計算寫入物件中 obj <-
.
以上所有內容都透過這個迷因得到了比文字更好的說明:
В data.table
鏈條的使用方式類似。
newDT <- DT[where, select|update|do, by][where, select|update|do, by][where, select|update|do, by]
在每個方括號中,您可以使用上一個運算的結果。
В pandas
此類操作由點分隔。
obj = df.fun1().fun2().fun3()
那些。 我們拿走我們的桌子 df 並使用她的方法 fun1()
,然後我們將該方法應用於所獲得的結果 fun2()
後 fun3()
。 結果被保存到一個物件中 OBJ .
數據結構
R 和 Python 中的資料結構相似,但名稱不同。
描述
R 中的標題
Python/pandas 中的名稱
表結構
資料框、資料表、小標題
數據框
一維值列表
向量
pandas 中的系列或純 Python 中的列表
多層非表格結構
列表
字典(字典)
我們將在下面查看一些其他功能和語法差異。
關於我們將使用的包的幾句話
首先,我將向您介紹一些有關您將在本文中熟悉的軟體包的資訊。
整潔的
官方網站:
文庫 tidyverse
由 RStudio 高級研究科學家 Hedley Wickham 撰寫。 tidyverse
包含一組令人印象深刻的軟體包,可簡化資料處理,其中 5 個軟體包包含在 CRAN 儲存庫的前 10 個下載中。
該庫的核心由以下套件組成: ggplot2
, dplyr
, tidyr
, readr
, purrr
, tibble
, stringr
, forcats
。 每個包都旨在解決一個特定的問題。 例如 dplyr
為資料操作而創建, tidyr
將資料整理成整齊的形式, stringr
簡化了字串的使用,並且 ggplot2
是最受歡迎的資料視覺化工具之一。
優勢 tidyverse
是簡單易讀的語法,它在許多方面類似於 SQL 查詢語言。
數據表
作者: data.table
是 H2O.ai 的 Matt Dole。
該庫的第一次發佈於 2006 年。
包語法並不像以下那麼方便 tidyverse
更讓人想起 R 中的經典資料框,但同時功能也顯著擴展了。
對該包中的表進行的所有操作都在方括號中描述,如果您翻譯語法 data.table
在 SQL 中,你會得到這樣的結果: data.table[ WHERE, SELECT, GROUP BY ]
該軟體包的優點是處理大量資料的速度。
大熊貓
官方網站:
該庫的名稱來自計量經濟學術語“面板資料”,用於描述多維結構化資訊集。
作者: pandas
是美國人韋斯·麥金尼。
當談到Python的數據分析時,等於 pandas
不。 一個非常多功能的高級包,可讓您對資料執行任何操作,從從任何來源載入資料到視覺化資料。
安裝附加包
本文討論的套件不包含在基本 R 和 Python 發行版中。 儘管有一個小警告,但如果您已經安裝了 Anaconda 發行版,請另外安裝 pandas
不需要。
在 R 中安裝套件
如果您至少打開過一次 RStudio 開發環境,您可能已經知道如何在 R 中安裝所需的套件。要安裝套件,請使用標準命令 install.packages()
直接在 R 本身中運行它。
# установка пакетов
install.packages("vroom")
install.packages("readr")
install.packages("dplyr")
install.packages("data.table")
安裝後需要連接包,大多數情況下使用命令 library()
.
# подключение или импорт пакетов в рабочее окружение
library(vroom)
library(readr)
library(dplyr)
library(data.table)
在 Python 中安裝套件
所以,如果你安裝了純Python,那麼 pandas
你需要手動安裝它。 開啟命令列或終端,具體取決於您的作業系統,然後輸入以下命令。
pip install pandas
然後我們返回Python並使用命令導入安裝的包 import
.
import pandas as pd
載入資料中
資料探勘是資料分析中最重要的步驟之一。 如果需要,Python 和 R 都為您提供了從任何來源獲取資料的廣泛機會:本地文件、來自 Internet 的文件、網站、各種資料庫。
在整篇文章中,我們將使用幾個資料集:
- 從 Google Analytics 下載兩次。
- 泰坦尼克號乘客資料集。
所有數據都在我的
將資料載入到 R 中:tidyverse、vroom、readr
將資料載入到庫中 tidyverse
有兩個包: vroom
, readr
. vroom
更現代,但將來這些包可能會合併。
引用自 vroom
.
弗魯姆 vs 讀者
釋放什麼vroom
意思是readr
? 目前我們計劃讓這兩個包單獨發展,但將來我們可能會將這兩個包聯合起來。 vroom 惰性讀取的一個缺點是某些數據問題無法預先報告,因此如何最好地統一它們需要一些思考。弗魯姆 vs 閱讀器
釋放是什麼意思?vroom
為readr
? 目前我們計劃單獨開發這兩個軟體包,但將來我們可能會將它們結合起來。 懶惰讀書的壞處之一vroom
就是有些數據問題是無法事先報告的,所以需要思考如何最好的結合。
在本文中,我們將研究這兩個資料載入包:
將資料載入到 R: vroom 套件中
# install.packages("vroom")
library(vroom)
# Чтение данных
## vroom
ga_nov <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")
將資料載入到 R:readr
# install.packages("readr")
library(readr)
# Чтение данных
## readr
ga_nov <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")
包裝內 vroom
,無論csv/tsv資料格式如何,均透過同名函數進行加載 vroom()
,在包包中 readr
我們對每種格式使用不同的函數 read_tsv()
и read_csv()
.
將資料載入到 R:data.table
В data.table
有一個載入資料的功能 fread()
.
將資料載入到R:data.table包中
# install.packages("data.table")
library(data.table)
## data.table
ga_nov <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")
在 Python 中載入資料:pandas
如果我們與 R 套件進行比較,那麼在這種情況下語法最接近 pandas
將 readr
, 因為 pandas
可以從任何地方請求數據,並且這個包中有一整套函數 read_*()
.
read_csv()
read_excel()
read_sql()
read_json()
read_html()
以及許多其他旨在讀取各種格式資料的函數。 但對於我們的目的來說就足夠了 read_table()
或 read_csv()
使用論證 九月 指定列分隔符號。
在 Python 中載入資料:pandas
import pandas as pd
ga_nov = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_nowember.csv", sep = "t")
ga_dec = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_december.csv", sep = "t")
titanic = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/titanic.csv")
建立資料框
桌子 泰坦尼克號,我們加載的,有一個字段 性別,儲存乘客的性別識別碼。
但為了更方便地按乘客性別顯示數據,您應該使用姓名而不是性別代碼。
為此,我們將建立一個小目錄,一個表,其中分別只有 2 列(程式碼和性別名稱)和 2 行。
在 R 中建立資料框:tidyverse、dplyr
在下面的程式碼範例中,我們使用函數建立所需的資料框 tibble()
.
在 R 中建立資料框:dplyr
## dplyr
### создаём справочник
gender <- tibble(id = c(1, 2),
gender = c("female", "male"))
在 R 中建立資料框:data.table
在 R 中建立資料框:data.table
## data.table
### создаём справочник
gender <- data.table(id = c(1, 2),
gender = c("female", "male"))
在 Python 中建立資料框:pandas
В pandas
創建框架分幾個階段進行,首先我們創建一個字典,然後將字典轉換為資料幀。
在 Python 中建立資料框:pandas
# создаём дата фрейм
gender_dict = {'id': [1, 2],
'gender': ["female", "male"]}
# преобразуем словарь в датафрейм
gender = pd.DataFrame.from_dict(gender_dict)
選擇列
您使用的表可能包含數十甚至數百列資料。 但為了進行分析,通常不需要來源表中的所有可用欄位。
因此,您將對來源表執行的首要操作之一是清除其中不必要的資訊並釋放該資訊所佔用的記憶體。
在 R 中選擇列:tidyverse、dplyr
句法 dplyr
與SQL查詢語言非常相似,如果你熟悉它,你很快就會掌握這個套件。
若要選擇列,請使用該函數 select()
.
以下是程式碼範例,您可以透過以下方式選擇列:
- 列出所需列的名稱
- 使用正規表示式引用列名
- 按資料類型或列中包含的資料的任何其他屬性
在 R 中選擇列:dplyr
# Выбор нужных столбцов
## dplyr
### выбрать по названию столбцов
select(ga_nov, date, source, sessions)
### исключь по названию столбцов
select(ga_nov, -medium, -bounces)
### выбрать по регулярному выражению, стобцы имена которых заканчиваются на s
select(ga_nov, matches("s$"))
### выбрать по условию, выбираем только целочисленные столбцы
select_if(ga_nov, is.integer)
在 R 中選擇列:data.table
相同的操作在 data.table
執行方式略有不同,在文章開頭我提供了方括號內參數的描述 data.table
.
DT[i,j,by]
在哪裡:
i - 哪裡,即按行過濾
j - 選擇|更新|執行,即選擇列並轉換它們
按資料分組
在 R 中選擇列:data.table
## data.table
### выбрать по названию столбцов
ga_nov[ , .(date, source, sessions) ]
### исключь по названию столбцов
ga_nov[ , .SD, .SDcols = ! names(ga_nov) %like% "medium|bounces" ]
### выбрать по регулярному выражению
ga_nov[, .SD, .SDcols = patterns("s$")]
多變的 .SD
允許您存取所有列,並且 .SDcols
使用正規表示式或其他函數過濾所需的列,以過濾您需要的列的名稱。
在 Python、pandas 中選擇列
按名稱選擇列 pandas
提供他們的名單就足夠了。 若要使用正規表示式按名稱選擇或排除列,您需要使用下列函數 drop()
и filter()
,和論證 軸= 1,用它表明有必要處理列而不是行。
若要按資料類型選擇字段,請使用該函數 select_dtypes()
,並進入論證 包括 或 排除 傳遞與您需要選擇的欄位相對應的資料類型清單。
在 Python 中選擇列:pandas
# Выбор полей по названию
ga_nov[['date', 'source', 'sessions']]
# Исключить по названию
ga_nov.drop(['medium', 'bounces'], axis=1)
# Выбрать по регулярному выражению
ga_nov.filter(regex="s$", axis=1)
# Выбрать числовые поля
ga_nov.select_dtypes(include=['number'])
# Выбрать текстовые поля
ga_nov.select_dtypes(include=['object'])
過濾行
例如,來源表可能包含幾年的數據,但您只需要分析過去一個月的數據。 同樣,額外的線路會減慢資料處理過程並堵塞 PC 記憶體。
在 R 中過濾行:tydyverse、dplyr
В dplyr
此函數用於過濾行 filter()
。 它採用資料幀作為第一個參數,然後列出過濾條件。
在編寫邏輯表達式來過濾表時,在這種情況下,指定不帶引號的列名,並且不聲明表名。
使用多個邏輯表達式進行篩選時,請使用下列運算子:
- & 或逗號 - 邏輯 AND
- | - 邏輯或
在 R 中過濾行:dplyr
# фильтрация строк
## dplyr
### фильтрация строк по одному условию
filter(ga_nov, source == "google")
### фильтр по двум условиям соединённым логическим и
filter(ga_nov, source == "google" & sessions >= 10)
### фильтр по двум условиям соединённым логическим или
filter(ga_nov, source == "google" | sessions >= 10)
在 R 中過濾行:data.table
正如我上面已經寫過的,在 data.table
資料轉換語法包含在方括號中。
DT[i,j,by]
在哪裡:
i - 哪裡,即按行過濾
j - 選擇|更新|執行,即選擇列並轉換它們
按資料分組
此參數用於過濾行 i,第一個位置位於方括號中。
在不帶引號且不指定表名的邏輯表達式中存取列。
邏輯表達式相互關聯的方式與 dplyr
透過 & 和 | 運算子。
在 R 中過濾行:data.table
## data.table
### фильтрация строк по одному условию
ga_nov[source == "google"]
### фильтр по двум условиям соединённым логическим и
ga_nov[source == "google" & sessions >= 10]
### фильтр по двум условиям соединённым логическим или
ga_nov[source == "google" | sessions >= 10]
Python 中的過濾字串:pandas
按行過濾 pandas
類似於過濾 data.table
,並在方括號中完成。
在這種情況下,對列的存取必須透過指示資料框的名稱來進行;那麼列名稱也可以用方括號中的引號來指示(例子 df['col_name']
),或在句號 (例子 df.col_name
).
如果需要按多個條件過濾資料框,則每個條件都必須放在括號中。 邏輯條件透過運算子相互連接 &
и |
.
Python 中的過濾字串:pandas
# Фильтрация строк таблицы
### фильтрация строк по одному условию
ga_nov[ ga_nov['source'] == "google" ]
### фильтр по двум условиям соединённым логическим и
ga_nov[(ga_nov['source'] == "google") & (ga_nov['sessions'] >= 10)]
### фильтр по двум условиям соединённым логическим или
ga_nov[(ga_nov['source'] == "google") | (ga_nov['sessions'] >= 10)]
資料分組和聚合
資料分析中最常用的操作之一是分組和聚合。
執行這些操作的語法分散在我們審查的所有套件中。
在本例中,我們將以資料框為例 泰坦尼克號,並根據艙位計算機票數量和平均費用。
R 中資料的分組與聚合:tidyverse、dplyr
В dplyr
此函數用於分組 group_by()
,並用於聚合 summarise()
。 實際上, dplyr
有一個完整的函數係列 summarise_*()
,但本文的目的是比較基本語法,因此我們不會進入這樣的叢林。
基本聚合函數:
sum()
— 總結min()
/max()
– 最小值和最大值mean()
- 平均的median()
— 中位數length()
- 數量
R 中的分組與聚合:dplyr
## dplyr
### группировка и агрегация строк
group_by(titanic, Pclass) %>%
summarise(passangers = length(PassengerId),
avg_price = mean(Fare))
在功能 group_by()
我們將表格作為第一個參數傳遞 泰坦尼克號,然後指示該字段 P類,我們將透過它對表格進行分組。 使用運算符執行此操作的結果 %>%
作為第一個參數傳遞給函數 summarise()
,並增加了另外 2 個欄位: 乘客 и 平均價格。 首先,使用函數 length()
計算了門票數量,並在第二次使用函數 mean()
收到平均票價。
R中資料的分組與聚合:data.table
В data.table
此參數用於聚合 j
它在方括號中有第二個位置,用於分組 by
或 keyby
,排名第三。
這種情況下的聚合函數列表與中描述的相同 dplyr
, 因為這些是基本 R 語法中的函數。
R 中的分組與聚合:data.table
## data.table
### фильтрация строк по одному условию
titanic[, .(passangers = length(PassengerId),
avg_price = mean(Fare)),
by = Pclass]
Python 中資料的分組與聚合:pandas
分組於 pandas
如同 dplyr
,但聚合並不類似 dplyr
一點也不 data.table
.
要分組,請使用方法 groupby()
,您需要向其中傳遞一個列列表,資料幀將按這些列進行分組。
對於聚合,您可以使用該方法 agg()
它接受字典。 字典鍵是您將套用聚合函數的列,值是聚合函數的名稱。
聚合函數:
sum()
— 總結min()
/max()
– 最小值和最大值mean()
- 平均的median()
— 中位數count()
- 數量
功能 reset_index()
在下面的範例中,它用於重置巢狀索引 pandas
預設為資料聚合後。
符號 允許您移動到下一行。
Python 中的分組與聚合:pandas
# группировка и агрегация данных
titanic.groupby(["Pclass"]).
agg({'PassengerId': 'count', 'Fare': 'mean'}).
reset_index()
表的垂直連接
連接兩個或多個具有相同結構的表的操作。 我們載入的資料包含表格 ga_nov и ga_dec。 這些表在結構上是相同的,即具有相同的列以及這些列中的資料類型。
這是從 Google Analytics 上傳的 XNUMX 月和 XNUMX 月數據,在本節中,我們將把這些數據合併到一個表中。
R 中的垂直連接表:tidyverse、dplyr
В dplyr
您可以使用下列函數將 2 個表合併為一個表 bind_rows()
,傳遞表作為其參數。
在 R 中過濾行:dplyr
# Вертикальное объединение таблиц
## dplyr
bind_rows(ga_nov, ga_dec)
R 中的垂直連接表:data.table
也不複雜,我們來使用 rbind()
.
在 R 中過濾行:data.table
## data.table
rbind(ga_nov, ga_dec)
Python 中的垂直連接表:pandas
В pandas
此函數用於連接表 concat()
,您需要向其中傳遞一個框架列表以將它們組合起來。
Python 中的過濾字串:pandas
# вертикальное объединение таблиц
pd.concat([ga_nov, ga_dec])
表的水平連接
透過鍵將第二個表中的列新增到第一個表中的操作。 當使用一些參考資料(例如,產品的成本)豐富事實表(例如,包含銷售資料的表)時,通常會使用它。
連接有多種類型:
在之前載入的表中 泰坦尼克號 我們有一個專欄 性別,對應乘客的性別代碼:
1 - 女性
2 - 男性
此外,我們還創建了一個表格 - 一本參考書 性別。 為了更方便呈現乘客性別數據,我們需要從目錄中加入性別姓名 性別 到餐桌上 泰坦尼克號.
R 中的水平表連接:tidyverse、dplyr
В dplyr
有一整套用於水平連接的函數:
inner_join()
left_join()
right_join()
full_join()
semi_join()
nest_join()
anti_join()
我的實踐中最常用的是 left_join()
.
作為前兩個參數,上面列出的函數需要連接兩個表,並且作為第三個參數 by 您必須指定要連接的列。
R 中的水平表連接:dplyr
# объединяем таблицы
left_join(titanic, gender,
by = c("Sex" = "id"))
R 中表格的水平連結:data.table
В data.table
您需要使用該函數按鍵連接表 merge()
.
data.table 中 merge() 函數的參數
- x, y - 用於連接的表
- by — 如果兩個表中的名稱相同,則作為連接鍵的列
- by.x, by.y - 要合併的列的名稱(如果它們在表中具有不同的名稱)
- all, all.x, all.y — 連接類型,all 將傳回兩個表中的所有行,all.x 對應於 LEFT JOIN 操作(將保留第一個表的所有行),all.y — 對應於RIGHT JOIN 操作(將保留第二個表格的所有行)。
R 中表格的水平連結:data.table
# объединяем таблицы
merge(titanic, gender, by.x = "Sex", by.y = "id", all.x = T)
Python 中的水平表連結:pandas
以及在 data.table
在 pandas
此函數用於連接表 merge()
.
pandas 中 merge() 函數的參數
- how — 連接類型:左、右、外、內
- on — 如果列在兩個表中具有相同的名稱,則該列是鍵
- left_on、right_on — 鍵列的名稱(如果它們在表中具有不同的名稱)
Python 中的水平表連結:pandas
# объединяем по ключу
titanic.merge(gender, how = "left", left_on = "Sex", right_on = "id")
基本視窗函數和計算列
視窗函數的意義與聚合函數類似,也常用於資料分析。 但與聚合函數不同,視窗函數不會更改傳出資料幀的行數。
本質上,使用視窗函數,我們根據某種標準將傳入的資料幀分成幾部分,即透過一個欄位或多個欄位的值。 我們對每個視窗進行算術運算。 這些操作的結果將在每一行中返回,即而不改變表中的總行數。
例如,我們以表為例 泰坦尼克號。 我們可以計算出每張機票的費用在其艙等等級內所佔的百分比。
為此,我們需要取得每行中該行機票所屬目前艙位的機票總費用,然後將每張機票的費用除以同一艙位所有機票的總費用。
R 中的視窗函數:tidyverse、dplyr
若要新增列而不使用行分組,請在 dplyr
服務功能 mutate()
.
您可以透過按欄位對資料進行分組來解決上述問題 P類 並將該欄位匯總到新列中 票價。 接下來,取消表格分組並分割欄位值 票價 到上一步發生的情況。
R 中的視窗函數:dplyr
group_by(titanic, Pclass) %>%
mutate(Pclass_cost = sum(Fare)) %>%
ungroup() %>%
mutate(ticket_fare_rate = Fare / Pclass_cost)
R 中的視窗函數:data.table
求解算法與中相同 dplyr
,我們需要將表格按字段拆分為窗口 P類。 在新列中輸出每行對應的組的金額,並添加一列,在其中計算每張票在其組中的成本份額。
新增列 data.table
操作員在場 :=
。 以下是使用該套件解決問題的範例 data.table
R 中的視窗函數:data.table
titanic[,c("Pclass_cost","ticket_fare_rate") := .(sum(Fare), Fare / Pclass_cost),
by = Pclass]
Python 中的視窗函數:pandas
新增列的一種方法 pandas
- 使用該功能 assign()
。 要按艙位匯總機票費用,無需對行進行分組,我們將使用該函數 transform()
.
以下是我們新增到表中的解決方案範例 泰坦尼克號 相同的 2 列。
Python 中的視窗函數:pandas
titanic.assign(Pclass_cost = titanic.groupby('Pclass').Fare.transform(sum),
ticket_fare_rate = lambda x: x['Fare'] / x['Pclass_cost'])
函數與方法對應表
以下是對我們考慮的套件中的資料執行各種操作的方法之間的對應表。
描述
整潔的
數據表
大熊貓
載入資料中
vroom()
/ readr::read_csv()
/ readr::read_tsv()
fread()
read_csv()
建立資料框
tibble()
data.table()
dict()
+ from_dict()
選擇列
select()
爭論 j, 方括號中的第二個位置
我們在方括號 / 中傳遞所需列的列表 drop()
/ filter()
/ select_dtypes()
過濾行
filter()
爭論 i, 方括號中的第一個位置
我們在方括號中列出篩選條件/ filter()
分組和聚合
group_by()
+ summarise()
論據 j + by
groupby()
+ agg()
表的垂直聯合 (UNION)
bind_rows()
rbind()
concat()
表格的水平連接 (JOIN)
left_join()
/ *_join()
merge()
merge()
基本視窗函數和新增計算列
group_by()
+ mutate()
爭論 j 使用運算符 :=
+ 論證 by
transform()
+ assign()
結論
也許在文章中我描述的不是數據處理的最佳實現,所以如果您糾正我在評論中的錯誤,或者只是用其他在R / Python 中處理數據的技術來補充文章中給出的信息,我將很高興。
正如我在上面所寫的,本文的目的不是強加一個人對哪種語言更好的看法,而是簡化學習兩種語言的機會,或者如果有必要的話,在它們之間遷移。
如果您喜歡這篇文章,我將很高興有新訂閱者
Опрос
您在工作中使用下列哪些軟體包?
在評論中你可以寫下你選擇的理由。
只有註冊用戶才能參與調查。
您使用哪個資料處理包(可以選擇多個選項)
-
企業排放佔全球 45,2%整潔宇宙19
-
企業排放佔全球 33,3%數據表14
-
企業排放佔全球 54,8%熊貓23
42 位用戶投票。 9 名用戶棄權。
來源: www.habr.com