选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

通过在互联网上搜索 R 或 Python,您会发现数以百万计的文章和数公里的讨论,主题是哪一个更好、更快、更方便地处理数据。 但不幸的是,所有这些文章和争议都不是特别有用。

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

本文的目的是比较两种语言最流行的包中的基本数据处理技术。 并帮助读者快速掌握他们还不知道的东西。 对于那些使用 Python 编写代码的人,请了解如何在 R 中执行相同的操作,反之亦然。

在本文中,我们将分析 R 中最流行的包的语法。这些是库中包含的包 tidyverse还有包 data.table。 并将它们的语法与 pandas,Python 中最流行的数据分析包。

我们将逐步介绍数据分析的整个路径,从加载数据到使用 Python 和 R 执行分析窗口函数。

内容

如果您忘记了如何在所考虑的软件包之一中执行某些数据处理操作,本文可以用作备忘单。

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

  1. R 和 Python 之间的主要语法差异
    1.1. 访问包函数
    1.2. 任务
    1.3. Индексация
    1.4. 方法和面向对象编程
    1.5. 管道
    1.6. 数据结构
  2. 关于我们将使用的包的几句话
    2.1. 整洁的
    2.2. 数据表
    2.3. 大熊猫
  3. 安装软件包
  4. 加载数据中
  5. 创建数据框
  6. 选择您需要的列
  7. 过滤行
  8. 分组和聚合
  9. 表的垂直联合 (UNION)
  10. 表的水平连接 (JOIN)
  11. 基本窗口函数和计算列
  12. R与Python数据处理方法对应表
  13. 结论
  14. 关于您使用哪个软件包的简短调查

如果你对数据分析感兴趣,你可以找到我的 电报 и YouTube的 渠道。 大部分内容专门介绍 R 语言。

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,我在文章中写过这一点 “R 语言中的 OOP(第 1 部分):S3 类”。 总的来说,R 是一种函数式语言,它的一切都是基于函数构建的。 因此,例如,对于 Excel 用户,请转到 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 <-.

以上所有内容都通过这个模因得到了比文字更好的说明:
选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

В 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.org
选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回
图书馆 tidyverse 由 RStudio 高级研究科学家 Hedley Wickham 撰写。 tidyverse 包含一组令人印象深刻的软件包,可简化数据处理,其中 5 个包含在 CRAN 存储库下载量最高的 10 名中。

该库的核心由以下包组成: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats。 每个包都旨在解决一个特定的问题。 例如 dplyr 为数据操作而创建, tidyr 将数据呈现为整齐的形式, stringr 简化了字符串的使用,并且 ggplot2 是最流行的数据可视化工具之一。

优点 tidyverse 是简单易读的语法,它在很多方面类似于 SQL 查询语言。

数据表

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回官方网站: r-datatable.com

由作者 data.table 是 H2O.ai 的马特·多尔 (Matt Dole)。

该库的第一次发布于 2006 年。

包语法并不像以下那样方便 tidyverse 更让人想起 R 中的经典数据框,但同时功能也得到了显着扩展。

对该包中的表进行的所有操作都在方括号中描述,如果您翻译语法 data.table 在 SQL 中,你会得到这样的结果: data.table[ WHERE, SELECT, GROUP BY ]

该软件包的优点是处理大量数据的速度。

大熊猫

官方网站: pandas.pydata.org 选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

该库的名称来自计量经济学术语“面板数据”,用于描述多维结构化信息集。

由作者 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 的文件、网站、各种数据库。

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

在整篇文章中,我们将使用几个数据集:

  1. 从 Google Analytics 下载两次。
  2. 泰坦尼克号乘客数据集。

所有数据都在我的 GitHub上 以 csv 和 tsv 文件的形式。 我们将从哪里请求它们?

将数据加载到 R 中:tidyverse、vroom、readr

将数据加载到库中 tidyverse 有两个包: vroom, readr. vroom 更现代,但将来这些包可能会合并。

引用自 官方文档 vroom.

弗鲁姆 vs 读者
释放什么 vroom 意思是 readr? 目前我们计划让这两个包单独发展,但将来我们可能会将这两个包联合起来。 vroom 懒惰读取的一个缺点是某些数据问题无法预先报告,因此如何最好地统一它们需要一些思考。

弗鲁姆 vs 阅读器
释放是什么意思? vroomreadr? 目前我们计划单独开发这两个软件包,但将来我们可能会将它们结合起来。 懒惰读书的坏处之一 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 包进行比较,那么在这种情况下语法最接近 pandasreadr因为 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 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

因此,您将对源表执行的首要操作之一是清除其中不必要的信息并释放该信息占用的内存。

在 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 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

在 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 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

执行这些操作的语法分散在我们审查的所有包中。

在本例中,我们将以数据框为例 泰坦尼克号,并根据舱位计算机票数量和平均费用。

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。 这些表在结构上是相同的,即具有相同的列以及这些列中的数据类型。

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

这是从 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])

表的水平连接

通过键将第二个表中的列添加到第一个表中的操作。 当使用一些参考数据(例如,产品的成本)丰富事实表(例如,包含销售数据的表)时,通常会使用它。

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

连接有多种类型:

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

在之前加载的表中 泰坦尼克号 我们有一个专栏 性生活,对应乘客的性别代码:

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.tablepandas 该函数用于连接表 merge().

pandas 中 merge() 函数的参数

  • how — 连接类型:左、右、外、内
  • on — 如果列在两个表中具有相同的名称,则该列是键
  • left_on、right_on — 键列的名称(如果它们在表中具有不同的名称)

Python 中的水平表连接:pandas

# объединяем по ключу
titanic.merge(gender, how = "left", left_on = "Sex", right_on = "id")

基本窗口函数和计算列

窗口函数的含义与聚合函数类似,也常用于数据分析中。 但与聚合函数不同,窗口函数不会更改传出数据帧的行数。

选择哪种语言来处理数据 - R 还是 Python? 两个都! 从 pandas 迁移到 tidyverse 和 data.table 并返回

本质上,使用窗口函数,我们根据某种标准将传入的数据帧分成几部分,即通过一个字段或多个字段的值。 我们对每个窗口进行算术运算。 这些操作的结果将在每一行中返回,即而不改变表中的总行数。

例如,我们以表为例 泰坦尼克号。 我们可以计算出每张机票的费用在其舱位等级内所占的百分比。

为此,我们需要获取每行中该行机票所属当前舱位的机票总费用,然后将每张机票的费用除以同一舱位所有机票的总费用。

R 中的窗口函数:tidyverse、dplyr

要添加新列而不使用行分组,请在 dplyr 服务功能 mutate().

您可以通过按字段对数据进行分组来解决上述问题 P类 并将该字段汇总到新列中 FARE。 接下来,取消表格分组并划分字段值 FARE 到上一步中发生的情况。

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 中处理数据的技术来补充文章中给出的信息,我将很高兴。

正如我在上面所写的,本文的目的不是强加一个人对哪种语言更好的看法,而是简化学习两种语言的机会,或者如有必要,在它们之间迁移。

如果您喜欢这篇文章,我将很高兴有新订阅者 YouTube的 и 电报 渠道。

Опрос

您在工作中使用以下哪些软件包?

在评论中你可以写下你选择的理由。

只有注册用户才能参与调查。 登录拜托

您使用哪个数据处理包(可以选择多个选项)

  • 45,2%整洁宇宙19

  • 33,3%数据表14

  • 54,8%熊猫23

42 位用户投票。 9 名用户弃权。

来源: habr.com

添加评论