(数据科学学习手札01)Python与R基本数据结构之异同
Python
1.列表(list)
list1 = [i for i in range(10)] list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
特点:可遍历,可索引,可切片
列表的遍历:
方式1:
for i in range(len(list1)): print(list1[i])
0
1
2
3
4
5
6
7
8
9
方式2:
list1 = [i+1 for i in range(10)] for i,j in enumerate(list1): print(i,j) 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10
*这里的enumerate()方法用于返回序列对应元素的下标及值
列表的索引:
print(list[0])
0
列表的切片:
list1[2:6]
[2, 3, 4, 5]
2.字典(dictionary)
dic1 = {'a':1,'b':2,'c':3} dic1 {'a': 1, 'b': 2, 'c': 3}
特点:只可通过字典特有方法遍历,可通过'键-值‘的方式进行索引,键名不可重复,值可以重复
字典的遍历:
方式1:
for key in dic1.keys(): print(key) a b c
方式2:
for value in dic1.values(): print(value) 1 2 3
方式3:
for key,value in dic1.items(): print(key + str(value)) a1 b2 c3
字典的索引:
dic1['a'] 1
3.元组(tuple)
tp1 = (1,2,3,'a','b') tp1 (1, 2, 3, 'a', 'b')
特点:一经创建,则不可修改,因此可以用元组来存放一些重要的常数,可索引,可首尾连接不同的元组
4.集合(set)
list = [1,2,2,3,4,5,5,6,6,7,8,9]
set(list)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
特点:可通过集合来进行去重
R
1.向量(vector)
> v1 <- c(1,2,3,'a','b') > v1 [1] "1" "2" "3" "a" "b"
特点:可自由修改,切片,拼接,索引,遍历
向量的拼接技巧:
> v1 <- c(1,2,3,4) > v2 <- c(5,6) > c(v1,v2) [1] 1 2 3 4 5 6
2.矩阵(matrix)
> v1 <- 1:10 > v1 [1] 1 2 3 4 5 6 7 8 9 10 > mat1 <- matrix(v1,nrow=2,ncol=5) > mat1 [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10
特点:matrix只能存在为规则的矩形结构,不能像vector一样自由的做不规则切片和增减元素
matrix()的byrow参数
> mat1 <- matrix(v1,nrow=2,ncol=5,byrow=TRUE) > mat1 [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 6 7 8 9 10
byrow表示向量按行填充进而转为矩阵,默认byrow=FALSE
3.数组(array)
> v1 <- 1:50 > array1 <- array(v1,dim=c(5,5,2)) > array1 , , 1 [,1] [,2] [,3] [,4] [,5] [1,] 1 6 11 16 21 [2,] 2 7 12 17 22 [3,] 3 8 13 18 23 [4,] 4 9 14 19 24 [5,] 5 10 15 20 25 , , 2 [,1] [,2] [,3] [,4] [,5] [1,] 26 31 36 41 46 [2,] 27 32 37 42 47 [3,] 28 33 38 43 48 [4,] 29 34 39 44 49 [5,] 30 35 40 45 50
特点:与矩阵相似,但可以有大于2的维度
4.数据框(dataframe)
> v1 <- 1:4 > v2 <- 2:5 > v3 <- c('a','b','c','d') > d1 <- data.frame(v1, v2, v3) > d1 v1 v2 v3 1 1 2 a 2 2 3 b 3 3 4 c 4 4 5 d
特点:可以在不同字段下储存长度相等的不同数据类型的元素;不可按照下标索引值
数据框的列名索引:
> d1$v1
[1] 1 2 3 4
数据框的下标索引:
> d1[2,2]
[1] 3
PS:与Python pandas中的数据框进行对比
Pandas:
import pandas as pd v1 = [i for i in range(10)] v2 = [i+1 for i in range(10)] d1 = pd.DataFrame({'v1':v1, 'v2':v2}) d1 v1 v2 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10
pandas可以直接将矩阵(由列表嵌套成的矩阵,非numpy 中的matrix)转化为数据框
mat1 = [[1,2,3],[4,5,6]] index = ['a','b'] colnames = ['x','y','z'] d1 = pd.DataFrame(data=mat1,index=index,columns=colnames) d1 Out[11]: x y z a 1 2 3 b 4 5 6
pandas 数据框的索引
按字段名索引:
d1['v1'] Out[4]: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 Name: v1, dtype: int64
按下标索引:
d1.iloc[1] Out[6]: v1 1 v2 2 Name: 1, dtype: int64
*pandas中数据框的相关操作风格接近R
让我们回到R
5.列表(list)
> ele1 <- 1:20 > ele2 <- c('j','a','c','k') > ele3 <- matrix(1:20, nrow=4,ncol=5) > title <- 'List in R' > list1 <- list(title=title, num=ele1, char=ele2, mat=ele3) > list1 $title [1] "List in R" $num [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $char [1] "j" "a" "c" "k" $mat [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20
*与Python中的list不同,R中的列表可以依次存入数据类型与结构相异的独立对象,并可以通过下标索引及'$'索引获取对象