作者 | 黄伟呢

来源 | 数据分析与统计学之美

今天,我继续为大家讲述Pandas如何实现R语言的相关操作。

由于 Pandas 旨在提供人们使用 R 进行的大量数据操作和分析功能,因此本页开始提供更详细的 R 语言及其与 Pandas 相关的许多第三方库的介绍。

与 R 和 CRAN 库相比,我们关心以下几点:

  • ① 功能/灵活性:每个工具可以/不能做什么;

  • ② 性能:操作的速度。硬数字/基准是可取的;

  • ③ 易于使用:是一种更容易/更难使用的工具吗(鉴于并排代码比较,您可能必须对此做出判断);

此页面还为这些 R 包的用户提供了一些翻译指南。

要将 DataFrame 对象从 Pandas 传输到 R,一种选择是使用 HDF5 文件。

1. 快速参考

我们将从快速参考指南开始,将使用 dplyr 的一些常见 R 操作与 Pandas 等价配对。

① 查询、过滤、采样

R对列子范围 ( select(df, col1:col3) )的简写可以在 Pandas 中清晰地使用,如果您有列列表,例如 df[cols[1:3]] 或 df.drop(cols[1:3]),但按列名执行此操作有点麻烦。

② 排序

③ 转换

④ 分组和汇总

2. 基于R

① 用 R 的 c 切片

R 使得按名称访问 data.frame 列变得容易。

df <- data.frame(a=rnorm(5), b=rnorm(5), c=rnorm(5), d=rnorm(5), e=rnorm(5))
df[, c("a", "c", "e")]

或按整数位置。

df <- data.frame(matrix(rnorm(1000), ncol=100))
df[, c(1:10, 25:30, 40, 50:100)]

在 Pandas 中,按名称选择多列很简单。

df = pd.DataFrame(np.random.randn(10, 3), columns=list("abc"))
df[["a", "c"]]
df.loc[:, ["a", "c"]]

结果如下:

可以通过 iloc 索引器属性和 numpy.r_ 的组合,来实现按整数位置选择多个非连续列。

named = list("abcdefg")
n = 30
columns = named + np.arange(len(named), n).tolist()
df = pd.DataFrame(np.random.randn(n, n), columns=columns)
df.iloc[:, np.r_[:10, 24:30]]

结果如下:

② aggregate

在 R 中,您可能希望将数据拆分为子集并计算每个子集的平均值。使用名为 df 的 data.frame 并将其分为 by1 和 by2 组。

df <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99),by1 = c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12),by2 = c("wet", "dry", 99, 95, NA, "damp", 95, 99, "red", 99, NA, NA))
aggregate(x=df[, c("v1", "v2")], by=list(mydf2$by1, mydf2$by2), FUN = mean)

groupby() 方法类似于基 R的聚合函数。

df = pd.DataFrame({"v1": [1, 3, 5, 7, 8, 3, 5, np.nan, 4, 5, 7, 9],"v2": [11, 33, 55, 77, 88, 33, 55, np.nan, 44, 55, 77, 99],"by1": ["red", "blue", 1, 2, np.nan, "big", 1, 2, "red", 1, np.nan, 12],"by2": ["wet","dry",99,95,np.nan,"damp",95,99,"red",99,np.nan,np.nan,]})
g = df.groupby(["by1", "by2"])
g[["v1", "v2"]].mean()

结果如下:

③ match(%in%)

在 R 中选择数据的一种常用方法是使用 %in% ,它是使用函数 match 定义的。运算符 %in% 用于返回一个逻辑向量,指示是否存在匹配。

s <- 0:4
s %in% c(2,4)

isin() 方法类似于 R %in% 运算符。

s = pd.Series(np.arange(5), dtype=np.float32)
s.isin([2, 4])

结果如下:

match 函数在其第二个参数中,返回其第一个参数的匹配位置向量。

s <- 0:4
match(s, c(2,4))

④ tapply

tapply类似于aggregate,但数据可以在一个参差不齐的数组中,因为子类的大小可能是不规则的。使用名为baseball的data.frame,并根据数组检索信息team。

baseball <-data.frame(team = gl(5, 5,labels = paste("Team", LETTERS[1:5])),player = sample(letters, 25),batting.average = runif(25, .200, .400))tapply(baseball$batting.average, baseball.example$team,max)

在 Pandas 中,我们可以使用 pivot_table() 方法来处理这个。

import random
import stringbaseball = pd.DataFrame({"team": ["team %d" % (x + 1) for x in range(5)] * 5,"player": random.sample(list(string.ascii_lowercase), 25),"batting avg": np.random.uniform(0.200, 0.400, 25)})baseball.pivot_table(values="batting avg", columns="team", aggfunc=np.max)

结果如下:

⑤ subset

query() 方法类似于基本的 R 子集函数。在 R 中,您可能想要获取 data.frame 的某些行,其中一列的值小于另一列的值。

df <- data.frame(a=rnorm(10), b=rnorm(10))
subset(df, a <= b)
df[df$a <= df$b,]

在 Pandas 中,有几种方法可以执行子集化。您可以使用 query() 或传递表达式,就好像它是索引/切片以及标准布尔索引一样。

df = pd.DataFrame({"a": np.random.randn(10), "b": np.random.randn(10)})
df.query("a <= b")
df[df["a"] <= df["b"]]
df.loc[df["a"] <= df["b"]]

结果如下:

⑥ with

使用df在 R 中调用的带有列的 data.frame 的表达式a, b将使用with如下方式进行评估。

df <- data.frame(a=rnorm(10), b=rnorm(10))
with(df, a + b)
df$a + df$b

在 Pandas 中,使用 eval() 方法的等效表达式为。

df = pd.DataFrame({"a": np.random.randn(10), "b": np.random.randn(10)})
df.eval("a + b")
df["a"] + df["b"]

结果如下:

在某些情况下eval()会比纯 Python 中的评估快得多。

3. plyr库

plyr 是用于数据分析的拆分-应用-组合策略的 R 库。这些函数围绕 R 中的三个数据结构展开,a 代表数组,l 代表列表,d 代表 data.frame。下表显示了如何在 Python 中映射这些数据结构。

① ddply库

在 R 中使用名为 df 的 data.frame 的表达式,您要在其中按月汇总 x。

require(plyr)
df <- data.frame(x = runif(120, 1, 168),y = runif(120, 7, 334),z = runif(120, 1.7, 20.7),month = rep(c(5,6,7,8),30),week = sample(1:4, 120, TRUE)
)ddply(df, .(month, week), summarize,mean = round(mean(x), 2),sd = round(sd(x), 2))

在 Pandas 中,使用 groupby() 方法的等效表达式为。

df = pd.DataFrame({"x": np.random.uniform(1.0, 168.0, 120),"y": np.random.uniform(7.0, 334.0, 120),"z": np.random.uniform(1.7, 20.7, 120),"month": [5, 6, 7, 8] * 30,"week": np.random.randint(1, 4, 120)})grouped = df.groupby(["month", "week"])
grouped["x"].agg([np.mean, np.std])

结果如下:

4. 重塑

① melt.array

使用 R 中称为 a 的 3 维数组的表达式,您希望将其融合到 data.frame 中。

a <- array(c(1:23, NA), c(2,3,4))
data.frame(melt(a))

在 Python 中,由于 a 是一个列表,您可以简单地使用列表推导式。

a = np.array(list(range(1, 24)) + [np.NAN]).reshape(2, 3, 4)
pd.DataFrame([tuple(list(x) + [val]) for x, val in np.ndenumerate(a)])

结果如下:

② melt.list

使用 R 中称为 a 的列表的表达式,您要将其融合到 data.frame 中。

a <- as.list(c(1:4, NA))
data.frame(melt(a))

在 Python 中,此列表将是元组列表,因此 DataFrame() 方法会根据需要将其转换为数据帧。

a = list(enumerate(list(range(1, 5)) + [np.NAN]))
pd.DataFrame(a)

结果如下:

③ melt.data.frame

在 R 中使用名为 cheese 的 data.frame 的表达式,您要在其中重塑 data.frame。

cheese <- data.frame(first = c('John', 'Mary'),last = c('Doe', 'Bo'),height = c(5.5, 6.0),weight = c(130, 150)
)
melt(cheese, id=c("first", "last"))

在 Python 中,melt() 方法与 R 等效。

cheese = pd.DataFrame({"first": ["John", "Mary"],"last": ["Doe", "Bo"],"height": [5.5, 6.0],"weight": [130, 150]})pd.melt(cheese, id_vars=["first", "last"])
cheese.set_index(["first", "last"]).stack()  # alternative way

结果如下:

④ cast

在 R 中 acast 是一个表达式,它使用 R 中名为 df 的 data.frame 来转换为更高维数组。

df <- data.frame(x = runif(12, 1, 168),y = runif(12, 7, 334),z = runif(12, 1.7, 20.7),month = rep(c(5,6,7),4),week = rep(c(1,2), 6)
)mdf <- melt(df, id=c("month", "week"))
acast(mdf, week ~ month ~ variable, mean)

在 Python 中,最好的方法是使用 pivot_table()。

df = pd.DataFrame({"x": np.random.uniform(1.0, 168.0, 12),"y": np.random.uniform(7.0, 334.0, 12),"z": np.random.uniform(1.7, 20.7, 12),"month": [5, 6, 7] * 4,"week": [1, 2] * 6}
)mdf = pd.melt(df, id_vars=["month", "week"])pd.pivot_table(mdf,values="value",index=["variable", "week"],columns=["month"],aggfunc=np.mean
)

结果如下:

类似的 dcast 使用 R 中名为 df 的 data.frame 来聚合基于 Animal 和 FeedType 的信息。

df <- data.frame(Animal = c('Animal1', 'Animal2', 'Animal3', 'Animal2', 'Animal1','Animal2', 'Animal3'),FeedType = c('A', 'B', 'A', 'A', 'B', 'B', 'A'),Amount = c(10, 7, 4, 2, 5, 6, 2)
)dcast(df, Animal ~ FeedType, sum, fill=NaN)
# Alternative method using base R
with(df, tapply(Amount, list(Animal, FeedType), sum))

Python 可以通过两种不同的方式来解决这个问题。首先,类似于上面使用pivot_table()。

df = pd.DataFrame({"Animal": ["Animal1","Animal2","Animal3","Animal2","Animal1","Animal2","Animal3",],"FeedType": ["A", "B", "A", "A", "B", "B", "A"],"Amount": [10, 7, 4, 2, 5, 6, 2]})df.pivot_table(values="Amount", index="Animal", columns="FeedType", aggfunc="sum")

结果如下:

第二种方法是使用 groupby() 方法。

df.groupby(["Animal", "FeedType"])["Amount"].sum()

结果如下:

⑤ factor

pandas 具有用于分类数据的数据类型。

cut(c(1,2,3,4,5,6), 3)
factor(c(1,2,3,2,2,3))

在Pandas中,这是通过 pd.cut 和 astype("category") 完成的。

pd.cut(pd.Series([1, 2, 3, 4, 5, 6]), 3)
pd.Series([1, 2, 3, 2, 2, 3]).astype("category")

结果如下:

技术

用python写3D游戏,太赞了

资讯

算力超越iPhone,芯片堪比Mac

技术

31个好用的Python字符串方法

资讯

GPT-3平替版语言模型,性能更优化

分享

点收藏

点点赞

点在看

第3次翻译了 Pandas 官方文档,叒写了这一份R万字肝货操作!相关推荐

  1. 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式

    本文翻译自vtk官方文档:vtk_file_format 文末有链接 VTK提供了许多源对象和编写器对象,用于读取和写入流行的数据文件格式,此外,VTK也提供了自己的文件格式.创建一种数据文件格式的主 ...

  2. Pandas官方文档!(中文版PDF下载)

    Pandas是一个强大的分析结构化数据的工具集:它的使用基础是Numpy(提供高性能的矩阵运算):用于数据挖掘和数据分析,同时也提供数据清洗功能.学习Pandas最好的方法就是看官方文档: <1 ...

  3. pandas官方文档_电影数据轻松学习 Pandas

    还记得刚开始接触 Pandas 的时候,没有找到比较系统的教程,印象最深的是看过别人翻译的官方教程< 10 Minutes to Pandas >,遇到不懂的地方就去官网查查 API,后来 ...

  4. Pandas 官方文档 翻译

    本文档用于记录梧承本人学习 翻译:梧承 联系方式:chenwuji2000@foxmail.com 原文链接:User Guide - pandas 1.4.1 documentation 不定时更新 ...

  5. 翻译:vscode官方文档 - 设置

    原文 用户和工作区设置 通过 vscode 的各种设置可以很容易地配置您喜欢的地方.vscode 的编辑器.用户界面和功能行为的几乎每个部分都有您可以修改的选项. VS代码为设置提供了两个不同的作用域 ...

  6. python各库的官方文档(涉及各函数、参数的使用)(pandas、numpy、sklearn)

    对于常用的python函数,我们要找他的参数的意义的基本使用的方法,碎片化的一个一个在csdn或者别的地方找它的具体用法,很多时候效率很低,在这里推荐给大家几个常用的官方文档,里面包含了该库下的所有函 ...

  7. splash官方文档解读(翻译)

    安装 splash是一个类似于selenium的自动化浏览器,不过它与selenium还是有很大区别的:比如splash是异步的,splash暴露httpAPI来自动化操作. 安装很简单,需要先安装d ...

  8. python数据科学和机器学习常用库的官方文档

    文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...

  9. Swift 4官方文档中文版 The Basic(上)

    Swift学习交流群: 313838956 本群由Guards翻译组创建并维护, 志于给认真想学习Swift的同学打造一个良好的交流圈子. 该文章翻译自Apple官方文档: The Swift 4 P ...

最新文章

  1. 主席树 | 莫队 ---- Codeforces Round #716 (Div. 2) D. Cut and Stick [主席树or莫队优化] 区间众数问题(静态)
  2. Android中资源文件夹res/raw和assets的使用
  3. oracle创建表空间blocksize,oracle表空间大小的限制和DB_BLOCK_SIZE的概念
  4. powershell XML操作
  5. 字符串:你看的懂的KMP算法(带验证)
  6. Xcode里-ObjC, -all_load, -force_load
  7. *第十五周*数据结构实践项目三【B-树的基本操作】
  8. Swift 圆形进度条
  9. Python学习笔记17:玩转千图成像
  10. 短视频如何有效涨粉?三个小技巧来帮忙,吸粉引流也不难
  11. python剪贴板操作_python操作剪贴板
  12. Python中的if __name__ == ‘__main__‘什么意思?
  13. 【调试】你是一名优秀的侦探吗?
  14. 校园版网络教学平台搭建方案(学生端)
  15. 怎么在html文件中写css文件,html头文件中css怎么写?
  16. 完整教程:spring-boot-starter-data-elasticsearch整合elasticsearch 6.x
  17. 福禄克FLUKE 重磅发布两款红外热像仪— TiS55+和TiS75+
  18. 景德镇人都应该知道的一个历史人物--唐英
  19. Android7(N)开发者应该知道的一切(最全)
  20. 根据IP地址计算子网掩码、网络地址、广播地址、子网数

热门文章

  1. 成为优秀UI设计师需要具备哪些条件?
  2. DataWorks V2使用PyUdf
  3. 用户输入一个数字,找到所有能够除尽它的数的总个数
  4. 安装hadoop下的sqoop1.99.3及配置问题全解决
  5. VClient 无法连接Vcenter
  6. 利用SMS OSD实现win2008操作系统的部署
  7. java 品尝饮料_那些年我喝过的饮料
  8. 检验是否相关-------假设检验
  9. 通过CPAN安装Perl模块
  10. 黑色星期五Friday the Thirteenth