数据分析Python基础
文章内容输出来源:拉钩教育数据分析训练营–直达飞机票(想了解的小伙伴)
本人为传统行业ETL,想转行数据分析,感觉自学有点困难,之前偶然接触到拉钩教育中的1元文章,都是各领域大佬的手笔,内容质量很高,刚好拉钩也有数据分析的训练营,看了看课程安排,简单咨询了下,就报名了,现在学到了数据挖掘部分,感觉Python基础的内容有些都忘了,所以特意巩固下,才写的这篇文章
提示:以下是本篇文章正文内容,下面案例可供参考
Python数据结构
1.序列
序列是Python中最基本的一种数据结构,指的是一个可迭代的有序的集合,序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(通过index访问),并且序列中的数据会按照添加的顺序来分配索引,然而通过序列中元素是否可以改变又分为可变序列和不可变序列.
1.1 不可变序列
1.11 元组(tuple)
①什么是元组?
元组是一种不可变的序列,正是由于元组的对象不可变性,所以没有增删改操作,元组中可以存储不同类型的对象.
②元组的创建
操作如下:
1.使用()来创建元组
my_tup = () # 创建了一个空元组
print(my_tuple,type(my_tuple))
# result: () <class 'tuple'>
my_tuple = (1,2,3,4,5) # 创建了一个5个元素的元组
print(my_tuple,type(my_tuple))
# result: (1, 2, 3, 4, 5) <class 'tuple'>
2.元组是不可变对象,不能尝试为元组中的元素重新赋值
my_tuple[3] = 10 #注:体现了元组元素一旦添加不可修改
# result: TypeError: 'tuple' object does not support item assignment
3.当元组不是空元组时,括号可以省略
my_tuple = 5,2,0
print(my_tuple,type(my_tuple))
# result: (5, 2, 0) <class 'tuple'>
#注意但当元组中只有一个元素时候必须在元素后加个',',否则识别为原元素的数据类型(加不加括号都可以)
my_typle =(40)
type(my_typle)
# result: int 注:结果为int类型,也就是40的类型
#正确写法
my_tuple = 40, #等价于my_tuple = (40,)
type(my_typle)
# result: tuple 注:此时的my_tuple才是真正的元组
4.元组的解包(解构)
# 解包可以理解为就是将元组当中每一个元素都赋值给一个变量
my_typle = 4,False,28,'a'
a,b,c,d = my_tuple
print(a,b,c,d)
# result: 4 False 28 a
5.交互a 和 b的值,这时我们就可以利用元组的解包(相当方便)
#交换前
a = 5
b = 8
print(a,b)
# result: 5 8
a , b = b , a
#交换后
print(a , b)
# result:8 5
6.在对一个元组进行解包时,变量的数量必须和元组中的元素的数量一致
my_tuple = 10 , 20 , 30 , 40
m,n,x,y = my_tuple
print(m,n,x,y)
# result: 10 20 30 40
# 也可以在变量前边添加一个*,这样变量将会获取元组中所有剩余的元素
my_tuple = 1,2,3,4,5,6
a , b , *c = my_tuple
print(a,b,c)
#result: 1 2 [3, 4, 5, 6] 注:[3, 4, 5, 6] 部分为列表(list)后面会讲到
a , *b , c = my_tuple
print(a,b,c)
# result: 1 [2, 3, 4, 5] 6
a , b , *c = 'hello world'
print(a,b,c)
# result: h e ['l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
# 不能同时出现两个或以上的*变量
*a , *b , c = 'hello world' #两个'*'导致系统不会分配了,怕分不均打起来,它也是个老好人...
# result: SyntaxError: two starred expressions in assignmenta 注:结果报错
③元组的CRUD
(由于元组中元素不可变,所以就没有增删改操作,只有查询操作)
1.前面提到元组属于序列,序列的通性就有可以通过索引来访问序列中的元素(tuple,list,str)后面会陆续讲到,而且第一个元素的索引为0,最后一个元素索引为-1
my_tuple = (1,'str',False,7.8,None)
print(my_tuple[3],my_tuple[0]) #访问元组中第一个元素和第四个元素
# result: 7.8 1
# 访问最后一个元素
print(my_tuple[-1])
# result: None
2.突然想呼应下元组元素不可修改,真的吗?有'bug'? come to see see
my_tuple = (1,[2,'str',False],'hello')
#操作1
my_tuple[0] = 'wahaha' #哦哦!第一个元素的确不可修改
# result: 'tuple' object does not support item assignment
#操作2
my_tuple[1][0] = 'bug'
print(my_tuple)
# result: (1, ['bug', 'str', False], 'hello') 注:what fu** ? 啥子情况哟?说好一百年不许变呢?
#看一下 my_tuple 中第二个元素[2,'str',False] 在修改前后变化
my_tuple = (1,[2,'str',False],'hello')
#修改前:id()函数:打印对象在内存中的地址,id值相同就为同一个对象
print(my_tuple,type(my_tuple[1]),id(my_tuple[1]))
# result: (1, [2, 'str', False], 'hello') <class 'list'> 2595153146560
#修改后:
my_tuple[1][0] = 'bug'
print(my_tuple,type(my_tuple[1]),id(my_tuple[1]))
# result:(1, ['bug', 'str', False], 'hello') <class 'list'> 2595153146560
'''可以看出my_tuple的第一个元素(也就是[]整体)的地址2595153146560是没变的,变化的是元素中的元素变了,这是由于[2, 'str', False]是列表,my_tuple[1][0] = 'bug'操作是将列表[2, 'str', False]中的第一个元素2给修改成了'bug',而list本身是可变的,也就是list修改元素后,原list的地址是不变的,所以再回到元组中
元素不可变的说法是没问题的'''
#也可以如下尝试,尝试将[2,'str',False]整体进行修改
my_tuple[1] = 'bug' #再次验证tuple的元素不可变
# result: 'tuple' object does not support item assignment
④元组的遍历
什么是遍历?
个人理解为就是将对象中所有元素都拿出来瞧瞧
#遍历元组
1.方式一:for
my_tuple = ('a',True,None,1.0,5)
for i in my_tuple:
print(i, end = ' ') #注:print(end=' ')将末尾默认字符修改为空格,默认为换行符
# result: a True None 1.0 5 注:遍历就是将元组中所有元素获取一遍
2.方式二: while
my_tuple = ('a',True,None,1.0,5)
i = 0
while i < len(my_tuple): #相当于java中length
print(my_tuple[i],end=' ')
i+=1
# result: a True None 1.0 5
3.方式三:range()
my_tuple = ('a',True,None,1.0,5)
for i in range(len(my_tuple)):
print(my_tuple[i],end=' ')
i+=1
# result : a True None 1.0 5 注意:熟练一种即可(哪个舒服就用哪个)
⑤元组的常用函数
说明:如何查看对象的自带方法(dir)有哪些以及方法如何使用(help)
1.查看对象拥有哪些自带方法(dir)
dir(tuple) --查看元组有哪些自带方法(查看其他对象同理)
''' result: ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
注:我是小白,所以也就关注前后不带'_'的方法玩一玩了,这一看就剩count,和index方法了 '''
2.每个方法如何使用(help)
这里以元组的count()方法为例
help(tuple.count) #查看元组的count方法如何使用(以后学习一个新方法时使用)
# result: Help on method_descriptor:
#count(self, value, /) 注:简单看就是查看目标字符在对象中的个数
# Return number of occurrences of value.
下面介绍下这两个方法的使用
1)count():统计出现次数
my_tuple = ('a','b','c','c','c','a',1,1,2)
print(my_tuple.count('a'))
# result: 2 注:元组中有2个'a'
my_tuple.count(1)
# result: 2 注:元组中有2个1
2)index():查询元素第一次出现的位置,脾气暴躁(找不到就生气)
my_tuple = ('a','b','c','c','c','a',1,1,2)
my_tuple.index('b')
# result: 1 注:字符'b'第一次出现的索引为1
print(my_tuple.index(1))
# result: 6 注:数字1第一次出现的索引为6(虽然7位置也有1但是结果为第一次的位置)
#找不到就生气()报错
my_tuple = ('a','b','c','c','c','a',1,1,2)
my_tuple.index('lagou')
# result: ValueError: tuple.index(x): x not in tuple 注:当前元组没有此元素
3) in /not in 判断元组中是否包含某个元素
my_tuple = ('a','b','c','c','c','a',1,1,2)
'a' in my_tuple
# result: True
'lagou' in my_tuple
# result: False
'lagou' not in my_tuple
# result: True
4)sum(),如果元组中元素都为int或float,可以sum()直接求和 注:sum()为python自带函数
my_tuple = 1,2,3,4,5,3.7
sum(my_tuple)
# result: 18.7
⑥练习
说明,sales中每个元组为一个销售员的姓名以及第一季度(1,2,3月)的业绩
需求:求出一季度销冠(名字以及一季度业绩)
sales = (
("Peter", (78, 70, 65)),
("John", (88, 80, 85)),
("Tony", (90, 99, 95)),
("Henry", (80, 70, 55)),
("Mike", (95, 90, 95))
)
#1.精简前
champion = '' #销冠名字初始化为''
max = 0 #一季度最高销售额,初始化为0
for sale in sales: #遍历
name = sale[0] #取出名字
quarter = sale[1] #取出一季度(1,2,3月)业绩
quarter_sales = 0 #季度总销售额
for month_sales in quarter: #遍历每个人的一季度每个月的业绩
quarter_sales += month_sales #对一季度每个月业绩加和
if quarter_sales > max: #将所有销售员季度总和算出取最大的
champion = name #销冠姓名
max = quarter_sales #销冠季度业绩
print('第一季度的销售冠军是{0},总销售额为{1}万元'.format(champion,max))
# result: 第一季度的销售冠军是Tony,总销售额为284万元
# 2.精简后,简直不要太爽(代码精简)
champion = ''
max = 0
for name,quarter in sales: #这种写法可以回想元组的解包,("Peter", (78, 70, 65))中的Perter 赋值给name,(78, 70, 65)赋值给quarter
total = sum(quarter) #直接将一季度业绩(78, 70, 65)求和
if total > max:
max,champion = total,name #解包赋值
print('第一季度的销售冠军是{0},总销售额为{1}万元'.format(champion,max))
# result: 第一季度的销售冠军是Tony,总销售额为284万元
1.12 字符串(str)
①什么是字符串?
字符串其实也是一种序列,可以理解为一串整齐的按顺序排着队的字符,组成了字符串,那每个字符在队伍中都有自己的位置,这个位置就是下标,又叫作索引。
②字符串的创建
还记得学习Python运行的第一个程序,也是学习每种编程语言的第一个程序,对,没错,打印hello world! 它就是个字符串.
操作如下:
1.创建字符串(用单引号''或者双引号""都可以,没什么区别)
my_str = 'I love Python'
print(my_str,type(my_str))
# result: I love Python <class 'str'>
my_str1 = "good good study"
print(my_str1,type(my_str1)) #看个人习惯,我比较习惯单引号
# result: good good study <class 'str'>
2.三引号(将一大段内容原样输出) --来自某道翻译,不要见怪
motto = ''' #注三引号可以是单引号,也可以是双引号
Where there is a will there is a way,
burn one's Bridges,
the twelve Qin pass finally belongs to Chu;
Hard days,
three thousand more can swallow wu
'''
# result: print(motto) #原样输出
# Where there is a will there is a way,
# burn one's Bridges,
# the twelve Qin pass finally belongs to Chu;
# Hard days,
# three thousand more can swallow wu
3.有时候定义的字符串太长一行放不下,用'\'进行连接
story = 'this is a long long long long long \
story,a very very very ......' #虽然看着换行了但结果还是一行
print(story)
#result: this is a long long long long long story,a very very very ......
③常用函数及操作
1.字符串的格式化输出
1)格式化占位符
占位符 | 描述 |
---|---|
%d | 整数占位符 |
%f | 浮点数占位符 |
%.f | 指定精度的浮点数占位符 |
%s | 字符串占位符 |
%% | 输出百分号% |
操作如下: |
1.%d (整数占位符)
print('北上广数据分析师的平均薪资为%dK'% 20) 注:后面%后的20在输出时就替代了前面的%d,使得输出更加灵活
# result: 北上广数据分析师的平均薪资为20K
如果给%d 传入一个浮点数,那它会自动将它转换成整数(截断而不是四舍五入)
print('%d' % 3.1415926)
# result: 3
print('%d' % 3.9999999)
# resutl: 3
2.%f(浮点数占位符)、%.f