前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Python & R 数据框操作详细对比

Python & R 数据框操作详细对比

作者头像
用户11414625
发布2024-12-23 13:54:31
发布2024-12-23 13:54:31
9700
代码可运行
举报
文章被收录于专栏:生信星球520生信星球520
运行总次数:0
代码可运行

1. 数据框创建

R 代码:

代码语言:javascript
代码运行次数:0
复制
df1 <- data.frame(
    gene = paste0("gene", 1:4),
    change = c('up', 'up', 'down', 'down'),
    score = c(5, 3, -2, -4)
)
df1
代码语言:javascript
代码运行次数:0
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3
## 3 gene3   down    -2
## 4 gene4   down    -4

Python 代码:

DataFrame不是原生的,而是由pandas提供,接受字典,每列是一个键值对的格式。

代码语言:javascript
代码运行次数:0
复制
import pandas as pd

df1 = pd.DataFrame({
    'gene': ["gene" + str(i) for i in range(1, 5)],
    'change': ['up', 'up', 'down', 'down'],
    'score': [5, 3, -2, -4]
})
df1
代码语言:javascript
代码运行次数:0
复制
##     gene change  score
## 0  gene1     up      5
## 1  gene2     up      3
## 2  gene3   down     -2
## 3  gene4   down     -4

2. 排序和统计

代码语言:javascript
代码运行次数:0
复制
# 按单列排序
library(dplyr)
arrange(df1, score)
代码语言:javascript
代码运行次数:0
复制
##    gene change score
## 1 gene4   down    -4
## 2 gene3   down    -2
## 3 gene2     up     3
## 4 gene1     up     5
代码语言:javascript
代码运行次数:0
复制
arrange(df1, desc(score))
代码语言:javascript
代码运行次数:0
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3
## 3 gene3   down    -2
## 4 gene4   down    -4
代码语言:javascript
代码运行次数:0
复制
# 按多列排序
arrange(df1, change, desc(score))
代码语言:javascript
代码运行次数:0
复制
##    gene change score
## 1 gene3   down    -2
## 2 gene4   down    -4
## 3 gene1     up     5
## 4 gene2     up     3
代码语言:javascript
代码运行次数:0
复制
# 计数统计
table(df1$change)
代码语言:javascript
代码运行次数:0
复制
## 
## down   up 
##    2    2
代码语言:javascript
代码运行次数:0
复制
df1 %>% count(change)
代码语言:javascript
代码运行次数:0
复制
##   change n
## 1   down 2
## 2     up 2
代码语言:javascript
代码运行次数:0
复制
# 多列计数
df1 %>% count(change, score)
代码语言:javascript
代码运行次数:0
复制
##   change score n
## 1   down    -4 1
## 2   down    -2 1
## 3     up     3 1
## 4     up     5 1

python:

代码语言:javascript
代码运行次数:0
复制
# 按单列排序
df1.sort_values('score')
代码语言:javascript
代码运行次数:0
复制
##     gene change  score
## 3  gene4   down     -4
## 2  gene3   down     -2
## 1  gene2     up      3
## 0  gene1     up      5
代码语言:javascript
代码运行次数:0
复制
df1.sort_values('score', ascending=False)
代码语言:javascript
代码运行次数:0
复制
##     gene change  score
## 0  gene1     up      5
## 1  gene2     up      3
## 2  gene3   down     -2
## 3  gene4   down     -4
代码语言:javascript
代码运行次数:0
复制
# 按多列排序
df1.sort_values(['change','score'], ascending=[True,False])
代码语言:javascript
代码运行次数:0
复制
##     gene change  score
## 2  gene3   down     -2
## 3  gene4   down     -4
## 0  gene1     up      5
## 1  gene2     up      3
代码语言:javascript
代码运行次数:0
复制
# 计数统计
df1['change'].value_counts()
代码语言:javascript
代码运行次数:0
复制
## change
## up      2
## down    2
## Name: count, dtype: int64
代码语言:javascript
代码运行次数:0
复制
df1.groupby('change').size()
代码语言:javascript
代码运行次数:0
复制
## change
## down    2
## up      2
## dtype: int64
代码语言:javascript
代码运行次数:0
复制
# 多列计数
df1.groupby(['change','score']).size()
代码语言:javascript
代码运行次数:0
复制
## change  score
## down    -4       1
##         -2       1
## up       3       1
##          5       1
## dtype: int64

3. 数据框取子集

R:

代码语言:javascript
代码运行次数:0
复制
# 取单列(返回向量/Series)
df1$change
代码语言:javascript
代码运行次数:0
复制
## [1] "up"   "up"   "down" "down"
代码语言:javascript
代码运行次数:0
复制
df1[,"change"]
代码语言:javascript
代码运行次数:0
复制
## [1] "up"   "up"   "down" "down"
代码语言:javascript
代码运行次数:0
复制
# 取单列(返回数据框)
df1[,"change", drop=FALSE]
代码语言:javascript
代码运行次数:0
复制
##   change
## 1     up
## 2     up
## 3   down
## 4   down
代码语言:javascript
代码运行次数:0
复制
# 取多列
df1[,c("gene","score")]
代码语言:javascript
代码运行次数:0
复制
##    gene score
## 1 gene1     5
## 2 gene2     3
## 3 gene3    -2
## 4 gene4    -4
代码语言:javascript
代码运行次数:0
复制
# 取前3行
df1[1:3,]
代码语言:javascript
代码运行次数:0
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3
## 3 gene3   down    -2
代码语言:javascript
代码运行次数:0
复制
# 取特定行列
df1[1:3, 2:3]
代码语言:javascript
代码运行次数:0
复制
##   change score
## 1     up     5
## 2     up     3
## 3   down    -2

python:

注意行列索引(也就是行号列号)是从0开始。

  • 中括号取子集时,左边不允许空着,右边可以空着
  • 新增一行时,右边也不允许空着
代码语言:javascript
代码运行次数:0
复制
# 取单列(返回Series)
df1.change
代码语言:javascript
代码运行次数:0
复制
## 0      up
## 1      up
## 2    down
## 3    down
## Name: change, dtype: object
代码语言:javascript
代码运行次数:0
复制
df1['change']
代码语言:javascript
代码运行次数:0
复制
## 0      up
## 1      up
## 2    down
## 3    down
## Name: change, dtype: object
代码语言:javascript
代码运行次数:0
复制
# 取单列(返回数据框)
df1[['change']]
代码语言:javascript
代码运行次数:0
复制
##   change
## 0     up
## 1     up
## 2   down
## 3   down
代码语言:javascript
代码运行次数:0
复制
# 取多列
df1[['gene','score']]
代码语言:javascript
代码运行次数:0
复制
##     gene  score
## 0  gene1      5
## 1  gene2      3
## 2  gene3     -2
## 3  gene4     -4
代码语言:javascript
代码运行次数:0
复制
df1.loc[:,['gene','score']]
代码语言:javascript
代码运行次数:0
复制
##     gene  score
## 0  gene1      5
## 1  gene2      3
## 2  gene3     -2
## 3  gene4     -4
代码语言:javascript
代码运行次数:0
复制
# 取前3行
df1.iloc[0:3,:]
代码语言:javascript
代码运行次数:0
复制
##     gene change  score
## 0  gene1     up      5
## 1  gene2     up      3
## 2  gene3   down     -2
代码语言:javascript
代码运行次数:0
复制
# 取特定行列
df1.iloc[0:3, 1:3] #左包右不包
代码语言:javascript
代码运行次数:0
复制
##   change  score
## 0     up      5
## 1     up      3
## 2   down     -2
代码语言:javascript
代码运行次数:0
复制
df1.loc[:, 'change':'score'] #包含结束值,特有用法
代码语言:javascript
代码运行次数:0
复制
##   change  score
## 0     up      5
## 1     up      3
## 2   down     -2
## 3   down     -4

条件筛选:

R:

代码语言:javascript
代码运行次数:0
复制
df1[df1$score > 0,]
代码语言:javascript
代码运行次数:0
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3

python:

代码语言:javascript
代码运行次数:0
复制
df1[df1['score'] > 0]
代码语言:javascript
代码运行次数:0
复制
##     gene change  score
## 0  gene1     up      5
## 1  gene2     up      3

4. 属性

R:

代码语言:javascript
代码运行次数:0
复制
dim(df1)
代码语言:javascript
代码运行次数:0
复制
## [1] 4 3
代码语言:javascript
代码运行次数:0
复制
rownames(df1)
代码语言:javascript
代码运行次数:0
复制
## [1] "1" "2" "3" "4"
代码语言:javascript
代码运行次数:0
复制
colnames(df1)
代码语言:javascript
代码运行次数:0
复制
## [1] "gene"   "change" "score"

python:

代码语言:javascript
代码运行次数:0
复制
df1.shape
代码语言:javascript
代码运行次数:0
复制
## (4, 3)
代码语言:javascript
代码运行次数:0
复制
df1.index
代码语言:javascript
代码运行次数:0
复制
## RangeIndex(start=0, stop=4, step=1)
代码语言:javascript
代码运行次数:0
复制
df1.columns
代码语言:javascript
代码运行次数:0
复制
## Index(['gene', 'change', 'score'], dtype='object')
修改单个行/列名

R:

代码语言:javascript
代码运行次数:0
复制
# 修改列名
colnames(df1)[2] = "diff"
names(df1)[2] = "diff"

python:

不允许单独修改一个列名,必须全部修改或者是用rename修改

代码语言:javascript
代码运行次数:0
复制
# 修改列名
df1.columns = ['gene', 'diff', 'score']
df1.rename(columns={'change': 'diff'}, inplace=True)

R:

代码语言:javascript
代码运行次数:0
复制
# 查看数据详情
str(df1)
代码语言:javascript
代码运行次数:0
复制
## 'data.frame': 4 obs. of  3 variables:
##  $ gene : chr  "gene1" "gene2" "gene3" "gene4"
##  $ diff : chr  "up" "up" "down" "down"
##  $ score: num  5 3 -2 -4
代码语言:javascript
代码运行次数:0
复制
class(df1$score)
代码语言:javascript
代码运行次数:0
复制
## [1] "numeric"
代码语言:javascript
代码运行次数:0
复制
# 转换数据类型
as.character(df1$score)
代码语言:javascript
代码运行次数:0
复制
## [1] "5"  "3"  "-2" "-4"

python:

代码语言:javascript
代码运行次数:0
复制
# 查看数据详情
df1.info()
代码语言:javascript
代码运行次数:0
复制
## <class 'pandas.core.frame.DataFrame'>
## RangeIndex: 4 entries, 0 to 3
## Data columns (total 3 columns):
##  #   Column  Non-Null Count  Dtype 
## ---  ------  --------------  ----- 
##  0   gene    4 non-null      object
##  1   diff    4 non-null      object
##  2   score   4 non-null      int64 
## dtypes: int64(1), object(2)
## memory usage: 228.0+ bytes
代码语言:javascript
代码运行次数:0
复制
type(df1['score'])
代码语言:javascript
代码运行次数:0
复制
## <class 'pandas.core.series.Series'>
代码语言:javascript
代码运行次数:0
复制
# 转换数据类型
df1['score'].astype(str)
代码语言:javascript
代码运行次数:0
复制
## 0     5
## 1     3
## 2    -2
## 3    -4
## Name: score, dtype: object

5. 数据框合并

先制作输入数据

R :

代码语言:javascript
代码运行次数:0
复制
# 创建第一个数据框 test1
test1 <- data.frame(name = c('jimmy', 'nicker', 'Damon', 'Sophie'), 
                    blood_type = c("A", "B", "O", "AB"))

# 创建第二个数据框 test2
test2 <- data.frame(name = c('Damon', 'jimmy', 'nicker', 'tony'),
                    group = c("group1", "group1", "group2", "group2"),
                    vision = c(4.2, 4.3, 4.9, 4.5))

# 创建第三个数据框 test3
test3 <- data.frame(NAME = c('Damon', 'jimmy', 'nicker', 'tony'),
                    weight = c(140, 145, 110, 138))

# 合并 test1 和 test2
merge(test1, test2, by = "name")
代码语言:javascript
代码运行次数:0
复制
##     name blood_type  group vision
## 1  Damon          O group1    4.2
## 2  jimmy          A group1    4.3
## 3 nicker          B group2    4.9
代码语言:javascript
代码运行次数:0
复制
# 合并 test1 和 test3(列名不同)
merge(test1, test3, by.x = "name", by.y = "NAME")
代码语言:javascript
代码运行次数:0
复制
##     name blood_type weight
## 1  Damon          O    140
## 2  jimmy          A    145
## 3 nicker          B    110

Python :

代码语言:javascript
代码运行次数:0
复制
import pandas as pd
# 创建第一个数据框 test1
test1 = pd.DataFrame({
    'name': ['jimmy', 'nicker', 'Damon', 'Sophie'],
    'blood_type': ['A', 'B', 'O', 'AB']
})

# 创建第二个数据框 test2
test2 = pd.DataFrame({
    'name': ['Damon', 'jimmy', 'nicker', 'tony'],
    'group': ['group1', 'group1', 'group2', 'group2'],
    'vision': [4.2, 4.3, 4.9, 4.5]
})

# 创建第三个数据框 test3
test3 = pd.DataFrame({
    'NAME': ['Damon', 'jimmy', 'nicker', 'tony'],
    'weight': [140, 145, 110, 138]
})

# 合并 test1 和 test2
pd.merge(test1, test2, on='name')
代码语言:javascript
代码运行次数:0
复制
##      name blood_type   group  vision
## 0   jimmy          A  group1     4.3
## 1  nicker          B  group2     4.9
## 2   Damon          O  group1     4.2
代码语言:javascript
代码运行次数:0
复制
# 合并 test1 和 test3(列名不同)
pd.merge(test1, test3, left_on='name', right_on='NAME')
代码语言:javascript
代码运行次数:0
复制
##      name blood_type    NAME  weight
## 0   jimmy          A   jimmy     145
## 1  nicker          B  nicker     110
## 2   Damon          O   Damon     140

内连接、外连接和左连接

R:

代码语言:javascript
代码运行次数:0
复制
# R 代码
merge(test1, test2, by = "name")
代码语言:javascript
代码运行次数:0
复制
##     name blood_type  group vision
## 1  Damon          O group1    4.2
## 2  jimmy          A group1    4.3
## 3 nicker          B group2    4.9
代码语言:javascript
代码运行次数:0
复制
merge(test1, test2, by = "name", all = TRUE)
代码语言:javascript
代码运行次数:0
复制
##     name blood_type  group vision
## 1  Damon          O group1    4.2
## 2  jimmy          A group1    4.3
## 3 nicker          B group2    4.9
## 4 Sophie         AB   <NA>     NA
## 5   tony       <NA> group2    4.5
代码语言:javascript
代码运行次数:0
复制
merge(test1, test2, by = "name", all.x = TRUE)
代码语言:javascript
代码运行次数:0
复制
##     name blood_type  group vision
## 1  Damon          O group1    4.2
## 2  jimmy          A group1    4.3
## 3 nicker          B group2    4.9
## 4 Sophie         AB   <NA>     NA

python:

代码语言:javascript
代码运行次数:0
复制
pd.merge(test1, test2, on='name', how='inner')
代码语言:javascript
代码运行次数:0
复制
##      name blood_type   group  vision
## 0   jimmy          A  group1     4.3
## 1  nicker          B  group2     4.9
## 2   Damon          O  group1     4.2
代码语言:javascript
代码运行次数:0
复制
pd.merge(test1, test2, on='name', how='outer')
代码语言:javascript
代码运行次数:0
复制
##      name blood_type   group  vision
## 0   Damon          O  group1     4.2
## 1  Sophie         AB     NaN     NaN
## 2   jimmy          A  group1     4.3
## 3  nicker          B  group2     4.9
## 4    tony        NaN  group2     4.5
代码语言:javascript
代码运行次数:0
复制
pd.merge(test1, test2, on='name', how='left')
代码语言:javascript
代码运行次数:0
复制
##      name blood_type   group  vision
## 0   jimmy          A  group1     4.3
## 1  nicker          B  group2     4.9
## 2   Damon          O  group1     4.2
## 3  Sophie         AB     NaN     NaN
行列拼接

R:

代码语言:javascript
代码运行次数:0
复制
# R 代码
# 创建示例数据框 df1 和 df2
d1 <- data.frame(name = c('jimmy', 'nicker'), age = c(25, 30))
d2 <- data.frame(name = c('Damon', 'Sophie'), age = c(28, 22))
d3 <- data.frame(height = c(170, 165), weight = c(70, 60))
rbind(d1,d2)
代码语言:javascript
代码运行次数:0
复制
##     name age
## 1  jimmy  25
## 2 nicker  30
## 3  Damon  28
## 4 Sophie  22
代码语言:javascript
代码运行次数:0
复制
cbind(d1,d3)
代码语言:javascript
代码运行次数:0
复制
##     name age height weight
## 1  jimmy  25    170     70
## 2 nicker  30    165     60

python:

代码语言:javascript
代码运行次数:0
复制
# 创建示例数据框 d1 和 d2
d1 = pd.DataFrame({'name': ['jimmy', 'nicker'], 'age': [25, 30]})
d2 = pd.DataFrame({'name': ['Damon', 'Sophie'], 'age': [28, 22]})
d3 = pd.DataFrame({'height': [170, 165], 'weight': [70, 60]})
# 行
pd.concat([d1, d2])
代码语言:javascript
代码运行次数:0
复制
##      name  age
## 0   jimmy   25
## 1  nicker   30
## 0   Damon   28
## 1  Sophie   22
代码语言:javascript
代码运行次数:0
复制
# 列
pd.concat([d1, d3], axis=1)
代码语言:javascript
代码运行次数:0
复制
##      name  age  height  weight
## 0   jimmy   25     170      70
## 1  nicker   30     165      60
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 数据框创建
  • 2. 排序和统计
  • 3. 数据框取子集
  • 4. 属性
    • 修改单个行/列名
  • 5. 数据框合并
    • 行列拼接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档