大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由程茜与政委联合推出。
在Python中,基本的数据结构有列表、元祖、字典、集合等。当然,还有其他第三方库中的数据结构,比如Pandas库中的Dataframe。本部分重点介绍基本数据结构。
Python提供了列表这种数据类型,由一系列按特定顺序排列的元素组成。在Python中,用逗号将不同元素分隔开,整体放在一个方括号 [ ] 里就可以创建列表。列表中的数据类型可以是相同,也可以不同。当然,列表还可以嵌套列表。
例1
1list0=[] #创建空列表
2list1=['团购名','店名','团购活动ID'
,'团购介绍','购买人数','团购评价','评价人数','地址','团购内容'] #创建列表火锅数据字段名列表
3list2=['13377118','8','随便退']
4list3=['壹分之贰聚会吧桌游轰趴馆(旗舰店)',list2] #列表嵌套
例1中,列举出了常见的列表形式。空列表可以直接用[ ]建立。在List1中,可以把火锅数据的字段名都放在列表中。在List2中,'13377118'是团购活动的ID,是属于字符型,'8'表示购买人数,是数值型。List3是列表的嵌套形式,把列表直接当成新列表的某一个元素就可以。
1) 查看数据类型
在Python中,只有知道了变量的类型才能对其进行相应的操作,不同的数据类型操作方法是不同的。使用type()函数就可以查看。
例2
1type(list1) #返回值 <class 'list'>
在Python中,就表示变量的类型是列表。
2) 列表的连接
在数据分析中,经常需要把不同的列表合并起来成为一个新的列表。在Python中,列表连接类似字符串连接,使用+号即可。
例3
1list1=['团购名','店名','团购活动ID','团购介绍','购买人数','团购评价','评价人数','地址','团购内容']
2list4=['到期时间','团购价','市场价','备注','购买须知']
3list5=list1+list4
4print(list5)
5# 返回值为['团购名', '店名', '团购活动ID', '团购介绍', '购买人数', '团购评价', '评价人数', '地址', '团购内容', '到期时间', '团购价', '市场价', '备注', '购买须知']
通过List1与List4的连接,实现了把火锅数据集的列名放在同一个列表中。
3) 列表的长度
可以使用len函数来查看列表的长度。例如,在上例中建立的由coupon数据集的变量名构成的列表list5,可以通过len来查看其变量个数。
例4
4) 列表中是否存在某个元素
在Python中,经常使用in和not in来判断一个元素是否在列表中。结果返回逻辑值,TRUE或者FALSE。
例5
1'团购活动ID'in list5
2'客户名'in list5
5) 列表索引与切片
数据分析中,经常会存在不同数据结构的数据索引与切片问题。列表依然也有其索引与切片的规则。
列表索引使用的形式:列表名[索引数字]。划重点:索引数字表示的是元素所在的位置,Python中位置可是从0开始的,重要的话说3遍!
list5[0] #返回值'团购名'
列表切片通过“:”隔开索引的边界来实现。注意两个作为边界的索引,第一个索引的元素包含在切片中,第二个不包含在切片内(可以理解为区间中的左闭右开)。为了更加清楚的理解切片这个重要概念,这里使用下图。
例6
1list5[:] #返回值 list5的全部元素
2list5[:3] #返回值 ['团购名', '店名', '团购活动ID'],即list5第0个到第2个元素
3list5[2:7] #返回值['团购活动ID','团购介绍','购买人数','团购评价','评价人数']
6) 列表删除
列表删除使用del 函数就可以实现。
例7
例8
1list4=['到期时间','团购价','市场价','备注','购买须知']
2list4.append('团购名') #在列表的最后的位置加入"团购名"
3list4.insert(0,'店名') #在列表的第一个位置加入"店名"
4list4.append('团购名') #在列表的最后的位置再加入"团购名"
5list4.count('团购名') #计算有多少个元素是"团购名",返回值为2
具体结果,大家可以自己运行以后看看这些常用函数的变换。
元组是一种有序的数据类型,它不能被修改,故而其运行速度比列表快。它还有一个很大的优点,存于元组的数据较为安全(不会因为设计疏忽而改变数据内容)。
元组使用小括号()就可以建立。
例9
1tuple0=() # 建立空元组
2tuple1=(2,4
,5)
3tuple2=('a','b','c')
4tuple3=(21,'a','c')
元组与列表都是元素的序列,所以也可以和列表一样通过下标索引访问和截取元组。
例10
1tuple2[1] #返回值'b'
2tuple2[0:3] #返回值('a', 'b', 'c')
元组中的元素值是不允许修改的。例如,tuple2[2]的元素本身是'c',但是想把4赋值给这个位置的元素,进行内容更改,就会报错。
例11
图1
上例说明,元组是不可变的,不能对其中元素进行增、删、插、改等操作。但是我们可以对元组进行截取和拼接,以获得新的元组。
例12
1tuple4=tuple2+tuple3
2tuple5=tuple4[2:5]
运行结果:('c', 21, 'a'),实现了构建新元组的方法。
Python中,根据一个信息查找另一个 信息的方式就构成了 “键值对”,表示索引用的键和对应的值构成了成对关系。实际中有很多这样的例子,大家都会给自己的笔记本上密码,用户名和密码就是一个字典。当然,还有西安是火锅店的名称和联系电话构成的通讯录,有了这个通讯录,想吃哪家吃哪家。还有就是如下通讯录,Python学不好老师可是能够通过上面的电话号码叫家长的哦!小朋友们心里在呐喊 。
图2
使用花括号就可以创建字典,使用键-值(key-value)存储,其中key与value用冒号对应。
例13
1dict0={'六婆串串香火锅':6,'嗲串串':14}
2type(dict0)
从这个字典可以表示,六婆串串香火锅有6人团购,嗲串串有14人团购。
字典中的值的访问可以通过:字典名[键]来实现。字典中元素可以直接赋值,更改。
例14
字典中要给字典新加一个键值对,直接添加即可。
1dict0['古城串串']=0
2dict0 #返回值 {'六婆串串香火锅': 6, '古城串串': 0, '嗲串串': 14}
此时,字典dict0中多了一对键值对,('古城串串': 0)。
字典中元素还可以直接赋值,更改。操作起来很方便。例如,“古城串串”的团购人数增加了,就可以通过直接赋值实现字典的更新。
1dict0['古城串串']=2
2dict0 #返回值 {'六婆串串香火锅': 6, '古城串串': 2, '嗲串串': 14}
最后,字典中删除某个键值对用del函数就可以。
此时,字典中就没有'古城串串'。
表1
具体例子如下:
例15
1dict0.keys() #返回值['六婆串串香火锅', '嗲串串']
2dict0.values() #返回值[6, 14]
3dict0.items() #返回值[('六婆串串香火锅', 6), ('嗲串串', 14)]
4dict0.get('嗲串串') #返回值14
大家可以自己运行下代码,看看会出什样的结果。
图3
还记得它吗?刚上高一,我们接触数学课的第一个知识就是集合。Python中集合和字典一样,里面的顺序是无序的,元素不可重复,集合里的元素需要是不可变类型,和字典中的键一样,所以集合可以理解为,只有键没有值的字典。Python中集合在数据分析中有两个非常重要的功能,一是进行集合操作,二是消除重复元素。
1)直接使用{}创建。可以使用数值,字符串,元组而不能使用列表,字典当做元素值。
1set1={1,2,'s',1,1,1}
2set1
3type(set1)
2)使用列表或者元组创建,需要借助set()函数进行。
1set2=set([1,3,4,5])
2set2
3set3=set((1,3,'e'))
4set3
3)使用字符串创建。
1set4=set('python')
2set4 #返回值 {'h', 'n', 'o', 'p', 't', 'y'}
Python支持数学意义上的集合运算,比如交集、差集、补集、并集等。
例16
1A={1,2,3}
2B={3,4,5}
3A-B
4A|B
5A&B
大家可以自己运行代码看看结果与数学意义上的是否一样哈!
与列表、字典、元组一样,集合也有类似的操作。比如,向集合中添加元素,删除集合中的元素,清空集合中的所有元素。
例17
1set1={'古城串串','嗲串串','六婆串串香火锅'} #创建集合set1
2set1.add('天天鲜羊肉馆') #集合set1添加元素'天天鲜羊肉馆'
3set1.remove('天天鲜羊肉馆') #集合set1移除元素'天天鲜羊肉馆'
4set1.clear() #清空集合set1
以上代码实现了对集合set1的增、删、清空等操作。
数据分析的分析对象不仅仅限于数值型和字符型两种,常见的还有时间类型。时间类型可以看做一种特殊的数据结构,也可以是一种特殊的数据类型。通过时间类型数据能够获取到年、月、日和星期等信息。但是时间类型的数据在读入以后常以字符串的形式出现,无法实现相关分析。
对时间类型数据进行分析的前提就是把字符串的时间转换为标准时间。可以通过Pandas库里的to_datetime函数实现。首先,还是导入我们的coupon对应的数据,然后来查看下数据的前两行。
例18
图4
不难发现,coupon数据集中的’到期时间‘为时间类型的变量。那么它的具体类型是什么呢?通过dtypes查看。
例19
此时,转换前“到期时间”这一列的数据类型为object(具体含义可先有读者查找,以后仔细讲解)。那么转换以后是什么情况?
例20
1coupon['到期时间'] = pd.to_datetime(coupon['到期时间'])
2coupon['到期时间'].dtypes
运行完代码后,'到期时间'这一字段就变成了时间数据类型。进一步,我们可以考虑提取某条团购活动的年月日信息。转化为时间数据类型的变量给了这些操作带来了很大的便利。例如:去获取第一条团购活动的年月日。
例21
1coupon['到期时间'][0].year #返回值 2018
2coupon['到期时间'][0].month #返回值 8
3coupon['到期时间'][0].day #返回值 10
其实时间类型的数据具有很多属性可以被很方便的提取,提取方法与上面相同。具体的属性可以参考下表:
表2
很多时候数据中时间会以各种形式出现,那么如何来处理呢?这就可以用到time模块。
例22
1import time
2print(time.time()) #返回值为当前时间点的值,具体为1562438853.377634,是float格式的当前时间。
大家看到这一长串数字会感觉非常奇怪,怎么当前的时间值是一系列浮点数字。其实时间本身就是相对概念,所以在计算机存储中会给定一个初始时间(为1910年1月1日),然后给定一个计算规则,其他的时间只需要记录与这个初始时间的差距。如果要显示这个时间的真实表示方式,那么就利用这个算法做逆向运算就获得了当前的时间。通常说的时间戳单位就是这个概念,而时间戳是最适于做日期运算的结构。下面使用Python里的time库里的localtime函数,可以获取现在的时间的标准时间格式。
例23
1print(time.localtime(time.time()))# 返回值tuple格式的当前时间
time.localtime()方法成功的使时间戳转换成时间形式,但是此时是tuple格式的时间,还是不能使用。可以使在此基础上,使用time.asctime()方法。
1print
(time.asctime(time.localtime(time.time()))) # 返回值 Tue Jul 2 15:48:33 2019
进一步可以发现,这并不是常用的年、月、日中文习惯的数据格式。如何将时间数据变得规范,就显得非常重要。使用time.strftime函数就可以按照制定的形式制定时间数据。
例24
1print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())) #返回值2018-11-09 11:46:13
很明显,现在数据显示的形式是比较规范的形式。此外,还可以计算时间差或者给时间加上天数、小时等来计算未来的时间。
例25
1import datetime
2datetime.datetime.now()
3t1=datetime.datetime(2018, 11, 11, 11, 1, 29, 738212)
4t1
5t2=datetime.datetime.now()
6t2
7sub=t2-t1
8sub.seconds
9t2.year
10t2.month
11t2.day
12t2.hour
13t2.minute
14t2.second
具体结果,大家可以自己运行代码,体验datetime这个模块。
今天就讲到这里。