python 基础复习之集合

Posted @苏词吗?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 基础复习之集合相关的知识,希望对你有一定的参考价值。

# set是什么?用来干什么?
# python中,用set来表示一个无序不重复元素的序列。set的只要作用就是用来给数据去重。
#
# 可以使用大括号   或者 set() 函数创建集合,但是注意如果创建一个空集合必须用 set() 而不是  ,因为是用来表示空字典类型的
#
# 操作技巧


#1.set对字符串也会去重,因为字符串属于序列。
# str1 = set("abcdefgabcdefghi")
# str2 = set("abcdefgabcdefgh")
# print(str1,str2)
# print(str1 - str2) #-号可以求差集
# print(str2-str1)  #空值

set1 = 'height','get','color','name'

#              pop() 删除并获取右边的一个元素
# set1.pop()
# print(set1)


#       del 释放掉该集合 可能会报错
# del set1


#  #可以使用update添加一些元组列表,字典等。但不能是字符串,否则会拆分
# set1.update((4,4486496848,))
# print(set1)


#按元素去删除  不存在回报错
# set1.remove("get")
# print(set1)


#3.更新set中某个元素,因为是无序的,所以不能用角标
#所以一般更新都是使用remove,然后在add




#4.查询是否存在,无法返回索引,使用in判断
# if "get" in set1:
#     print("true")
# else:
#     print("不存在")
# '''
# true
# '''


# #5.终极大招:直接清空set
# print(set1)
# set1.clear()
# print(set1)
# '''
# set()
# '''

Python知识点复习之科研休闲篇

python的基础语法点,包含数据类型,运算符,列表、元组、集合、字典的基本操作,选择循环,函数等 ,基本都包含了,可以结合菜鸟教程看,还是比较舒服的。另外,数据分析三剑客,matplotlib,numpy,pandas的用法也分别给出了,代码注释齐全,直接看代码都可以的!

注意:本文所有的代码和数据集均上传到我的Github上,链接奉上:https://github.com/wgdwg/python-1https://github.com/wgdwg/python-1

目录

1-python常用语法知识

2-python数据可视化之matplotlib

3-python数值数据处理之numpy

4-python数据处理之pandas


1-python常用语法知识

'''
author:WangGuodong
time:2022-07-14
任务:复习python语法
'''

#1.数据类型
x = 3 + 4j #复数
a = 10 #整型
b = 14.3 #浮点型
c = 'hello world'#字符串类型
d = False #bool型
c = [1, 2, 3] #列表类型list
d = (1, 2, 3) #元组类型tuple
e = 1, 2, 3 #集合类型set
f = 'name':'wang', 'age':18 #字典类型dict
print(type(c), type(d), type(e), type(f))
print(type(x))

#2.格式化输出
name = 'wang'
age = 24
weight = '60'
id = '0692'
print('我的名字叫%s' %name)
print('我的年龄%d' %age)
print('我的名字叫%s,我的年龄%s岁,我的体重是%skg,我的学号是%s' %(name, age, weight, id))

#3.常用的转义字符
print('hello\\n' 'python') #换行
print('hello\\t' 'python') #制表符,一个tab键的距离
#print默认的结束字符是换行,结束的字符也可以是其它的
print('hello', end='\\t')
print('python', end='\\n')
print('hello', end='  ')

#4.输入和输出
password = input('请输入你的密码:')
print(password)
print(type(password))

#5.数据类型的转换
number = input('请输入一个大于10,小于20的数字:')
print(number)
print(type(number), type(int(number)), type(float(number))) #分别转换成整型和浮点型
print(type(list(number)), type(tuple(number)), type(str(number)))#转换成列表、元组、字符串类型


#6.运算符:基本运算符、复合赋值运算符、逻辑运算符
x1 = 5
y1 = 2
print(x1+y1, x1-y1, x1*y1, x1/y1, x1//y1) #加、减、乘、除、整除
print(x1%y1, x1**y1) #取余和指数次方
x1 //= y1 #整除并赋值
print(x1)
x1 **= y1 #幂次方并赋值
print(x1)
x2 = True
y2 = False
print(x2 and y2 , x2 or y2, not x2, not y2)

#7.条件语句
if True:
    print('正确!')
else:
    print('错误!')

ages = 22
if ages >= 18:
    print('恭喜您已经成年了!!!')
elif ages >= 1 and ages <= 17:
    print('不好意思,你尚未成年!!!')
else:
    print('你的输入错误,请重新输入,谢谢!!!')

#8.循环语句
#range的用法,range是左闭右开的区间
s = range(10) #默认从0开始,步长为1
print(s)
print(list(s)) #转换成列表的形式,步长为1,即0~9
print(list(range(1,10))) #1~9,步长为1
print(list(range(1,10,2))) #1~9,步长为2
print(list(range(10,0,-1))) #从10开始,步长为-1,从10到1
print(10 in s) #判断10是否在序列中
print(10 not in s)
#while循环,从1加到100
sum = 0
s0 = 1
while s0 <= 100:
    sum += s0
    s0 += 1
print(sum)
#for --- in 循环的使用
for item in 'python' : #一次读取python中的每个单词
    print(item, end = ' ')
for i in range(1,11):
    print(i, end=' ') #产生1~10的整数序列
print()
for _ in range(1,10):
    print('好好科研,好好努力,大厂offer拿到手软!!!')
sum1 = 0
for i in range(0,101):
    sum1 += i
print(sum1)
lis = [1,2,3,4,5,6]
for j in range(0,len(lis)):
    print(lis[j], end=' ')
print()

#9.列表的使用
lst = [1, 2, 'hello', 4.5]
for i in range(0, len(lst)): #打印lst列表中的元素
    print(lst[i])
print(lst.index('hello')) #根据列表元素查找索引
print(lst[-1]) #最后一个元素,逆向索引
print(lst[0]) #第一个元素,正向索引
#切片的方式获取列表中的多个元素
print(lst[0:len(lst):1]) #三个位置的元素分别为起始位置,结束位置,步长
print(lst[0:len(lst):2])
#注意,如果省略起始位置,则默认从头开始,省略步长,则默认步长为1,省略结束位置,则默认最后一个元素的位置
#另外,如果步长出现负数,则默认从后往前遍历
#列表元素的判断及遍历
print(1 in lst)
print(1 not in lst)
for k in lst:
    print(k, end=' ')
print()
#向列表中添加元素
lst.append('learning') #在列表末尾追加一个元素
lst1 = [2,3,4]
lst.extend(lst1) #在列表后追加多个元素
lst.insert(0,100) #在第一个位置插入元素100
print(lst)
lst2 = ['java', 'c', 'Matlab']
lst[1:1:1] = lst2 #在设定的位置插入列表
print(lst)
#删除列表中的元素
lst3 = [1,2,3,4,5,6,7,8,'hello']
lst3.remove('hello') #将指定元素从列表删除
print(lst3)
lst3.pop(0) #删除指定索引的元素
print(lst3)
lst3.clear()
print(lst3) #清空列表元素
del lst3 #删除列表
#print(lst3)
#修改列表元素的值
lst4 = [1,2,3,'hello',4]
lst4[0] = 100 #将第一个元素的值修改为100
print(lst4)
lst4[1:5] = [200, 300, 400, 500]#修改第二个元素到最后一个元素的值
print(lst4)
#对列表元素进行排序
lst5 = [1,4,3,2,6,5]
lst5.sort() #默认升序排序
print(lst5)
lst5.sort(reverse=True) #降序排序
print(lst5)
lst10 = [1,2,3,4,5,5,5,6]
lst11 = [1,2,3,4,6,6,6,5]
print(len(lst10)) #列表的长度
print(max(lst10)) #列表的最大元素
print(min(lst10)) #列表的最小元素
print(lst10.count(5)) #统计元素5在列表中出现的次数


#10.字典的操作
scores = '唐乃乔': 99, '缪鹏':100, '谭祖万': 67
print(scores)
print(type(scores))
print(scores['唐乃乔'])
print(scores.get('唐乃乔'))
print('谭祖万' in scores) #判断谭祖万是否在scores集合中
del scores['唐乃乔'] #删除键值对
print(scores)
scores['唐乃乔'] = 97 #新增键值对
print(scores)
scores['唐乃乔'] = 88 #修改已有键值对
print(scores)
keys = scores.keys() #获取字典的所有键
print(list(keys))
values = scores.values()#获取字典的所有值
print(list(values))
#遍历字典,获取键值对
for item in scores:
    print(item, scores.get(item))
scores.clear() #清空字典中的元素
print(scores)


#11.元组的基本操作,用的很少
t = ('java', 'C', 'python')
print(t)
for i in t:
    print(i, end=' ')
print()


#12.集合的操作
s1 = 1,1,1,2,3,4,4,5,8,7,9,0 #集合自动去重和排序
print(s1)
s2 = set(range(0,11)) #set方式创建集合
print(s2)
s3 = set([1,4,3,3]) #列表转换成集合,自动排序和去重
print(s3)
print(1 in s3, 1 not in s3) #判断元素是否在集合s3中
s3.add(5) #集合中添加元素
print(s3)
s3.update(6,7,8) #集合中添加多个元素
print(s3)
#分别删除集合中的元素8个元素7
s3.remove(8)
s3.discard(7)
print(s3)
s3.pop() #删除集合中的第一个元素
print(s3)
s3.clear() #清空集合中的元素
print(s3)


#12.字符串的基本操作
s = 'hello World'
print(s.swapcase()) #大写变小写,小写变大写
print(s.find('l')) #查找l第一次出现的位置
print(s.rfind('l')) #查找l最后一次出现的位置
print(s.upper()) #字符串转大写
print(s.lower()) #字符串转小写
print(s.title()) #首字母变大写
print(s.capitalize())#首字母变大写
#字符串的拆分操作
s2 = 'java | c| python'
s3 = s2.split(sep='|') #从左侧拆分
print(s3)
s4 = s2.split(sep='|') #从右侧拆分
print(s4)
s5 = s2.split(sep='|', maxsplit=1) #指定拆分次数为1次
print(s5)
#常用的字符串判断方法如下
print(s2.isalnum()) #字符串是否由字母和数字组成
print(s2.isnumeric()) #字符串是否全由数字组成
print(s2.isalpha()) #字符串是否全由字母组成
print(s2.isidentifier()) #判断字符串是否是合法的标识符
#字符串的替换与合并
s11 = 'hello python python python'
s12 = s11.replace('python', 'java')
print(s12)
print(s11.replace('python','java', 2)) #指定替换次数为2次
#字符串的拼接
print('-'.join(s11)) #档额字符的拼接
s13 = ['java', 'c', 'python']
print('-'.join(s13)) #字符串列表的拼接
s14 = 'hello'


#13.函数的定义和使用
def cal1(a,b): #带返回值的函数
    return a + b

def cal2(num):
    odd = []
    even = []
    for i in num:
        if i%2==0:
            even.append(i)
        else:
            odd.append(i)
    return odd, even

def cal3(a, b): #无返回值的函数
    print(a**b)

ls = [1,2,3,4,5,6,7,8]
print(cal2(ls))
print(cal1(4,5))
cal3(2,3)

2-python数据可视化之matplotlib

绘制散点图的代码:

'''
python数据可视化之matplotlib
可以考虑使用matplotlib绘制各种图形
常用的就是绘制散点图,折线图,条形图等
author:WangGuodong
time:2022-07-14
'''

from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc('font', family='YouYuan')

y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
x_3 = range(1,32)

plt.scatter(x_3, y_3,color='r')
#调整x轴的刻度
x_label = ['March '.format(i) for i in x_3]
plt.xticks(x_3[::3], x_label[::3],rotation=45)

plt.xlabel('time:(month)')
plt.ylabel('temperature:(℃)')
plt.show()

绘制的散点图如下:

绘制折线图的代码如下:

'''
使用matplotlib绘制折线图
author:WangGuodong
time:2022-07-14
'''

from matplotlib import pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
x = range(2,26,2)
y1 =  [15, 13, 14.5, 17, 20, 25, 26, 26, 24, 22, 18, 15]
y2 = [10, 11, 13.5, 14, 14.5, 17, 19, 21, 20, 17, 14, 11]
plt.plot(x,y1,marker='o',label='室外温度')
plt.plot(x,y2,marker='*',label='室内温度')
plt.xticks(range(min(x),max(x)+2,2))
plt.yticks(range(5,max(y1,)))
plt.xlabel('时间:(hours)')
plt.ylabel('温度:(℃)')
plt.legend() #图例生效代码
plt.show()#图片显示代码

绘制的折线图如下:

绘制条形图的代码:

'''
使用matplotlib绘制条形图
author:WangGuodong
time:2022-07-14
'''

from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc('font', family='YouYuan')
x = ['西红柿首富', '战狼2', '红海行动', '泰囧','美人鱼']
y = [15, 52, 16, 10, 33]

plt.bar(range(len(x)), y, width=0.6, color='blue')
#设置x轴
plt.xticks(range(len(x)), x)
plt.xlabel('Movie name')
plt.ylabel('Movie box office')
plt.show()

绘制的条形图如下:

 绘制条形图的代码2:

'''
使用matplotlib绘制条形图
author:WangGuodong
time:2022-07-14
'''

from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc('font', family='YouYuan')
x = ['西红柿首富', '战狼2', '红海行动', '泰囧','美人鱼']
y = [15, 52, 16, 10, 33]

plt.barh(range(len(x)), y, height=0.5, color='orange')
#设置x轴
plt.yticks(range(len(x)), x)
plt.xlabel('Movie box office')
plt.ylabel('Movie name')
plt.show()

绘图的条形图2如下所示:

3-python数值数据处理之numpy

'''
numpy是python进行数值数据处理的库
作为科学计算的库,重在大型的数值计算,多维矩阵执行数值运算
Author:WangGuodong
time:2022-07-14
'''

import numpy as np
import random
from matplotlib import pyplot as plt
import matplotlib
matplotlib.rc('font', family='YouYuan')
#生成ndarray类型的列表
#使用np.array()方法生成列表
t = np.array([1,2,3])
print(t, type(t))
t1 = np.array(range(10)) #生成0~9的列表
print(t1, type(t1))
t2 = np.arange(10) #生成0~9的列表
print(t2, type(t2))
t3 = np.arange(4,10,2) #生成步长为2的列表
print(t3, type(t3))
print("*" * 100)

#numpy中的数据类型
t4 = np.array(range(1,4),dtype=float)
print(t4, t4.dtype)
t5 = np.array([1,0,0,1,0],dtype=bool)
print(t5, type(t5))
t6 = t4.astype(int)
print(t6, t6.dtype)
t7 = np.array([random.randint(1,10) for i in range(10)])
t8 = np.array(list(random.random() for i in range(10)))
print(t7, t7.dtype)
print(t8, t8.dtype)
print(np.round(t8,2)) #保留两位有效数字
print('*' * 100)

#矩阵维度的修改
x1 = np.array(range(12))
print(x1.shape) #打印矩阵的维度信息
print(x1.reshape(3,4)) #修改矩阵的维度信息
x2 = np.arange(12)
x2 = x2.reshape(3,4)
x3 = x2.reshape(x2.shape[0]*x2.shape[1],) #转换成一维
print(x3)

#numpy读取本地数据和索引
file_path = './ratings.csv'
file1 = np.loadtxt(file_path,delimiter=',',dtype=float,skiprows=1)
file2 = np.loadtxt(file_path,delimiter=',',dtype=float,skiprows=1,unpack=True) #将数据的列变成行
print(file1)
print('*' * 100)
print(file2)
#矩阵的转置
t2 = np.arange(24).reshape(4,6)
print(t2)
print(t2.T)#转置
print('*' * 100)
#对矩阵中的元素进行修改
print(t2[2,:]) #去除第3行
print(t2[2:]) #取出第3行及之后的所有行
print(t2[[1,3]]) #取出不连续的多行
print(t2[:,[1,3]]) #取出不连续的多列
print(t2[1,2]) #取出某个元素的值
print(np.where(t2<10,0,10)) #小于10,赋值0,反之,赋值10
print(t2[t2>=10]) #找出矩阵中大于等于10的元素
print(t2.clip(10,18)) #小于10的替换为10,大于18的替换为18
print('*' * 100)
#数据的拼接
y1 = np.array([[1,2,3],[4,5,6]])
y2 = np.array([[0,1,2],[3,4,5]])
print(y1)
print(y2)
print('*' * 100)
print(np.vstack([y1, y2])) #竖直拼接
print('*' * 100)
print(np.hstack([y1,y2])) #水平拼接
print('*' * 100)
y1[[0,1],:] = y1[[1,0],:] #第一行和第二行互换
print(y1)
print('*' * 100)
y2[:,[0,1]] = y2[:,[1,0]] #第一列和第二列交换
print(y2)

#将两个数据集融合到一起,保留原始数据信息
us_path = "./US_video_data_numbers.csv"
gb_path = "./GB_video_data_numbers.csv"
#加载国家数据
us_data = np.loadtxt(us_path,delimiter=',',dtype=int)
gb_data = np.loadtxt(gb_path,delimiter=',',dtype=int)
#构造一个全为0和全为1的数组
zeros_data = np.zeros((us_data.shape[0],1)).astype(int)
ones_data = np.ones((gb_data.shape[0],1)).astype(int)
us_data = np.hstack((us_data, zeros_data))
gb_data = np.hstack((gb_data, ones_data))
final_data = np.vstack((us_data,gb_data))
print(final_data)
print('*' * 100)

#特殊矩阵的创建
z1 = np.zeros((2,3)).astype(int) #2行3列的0矩阵
z2 = np.ones((3,2)).astype(int) #3行2列的1矩阵
z3 = np.eye(4).astype(int) #四阶的单位矩阵
print(z1)
print(z2)
print(z3)
print(np.argmax(z3,axis=0)) #每一列最大值的位置
print(np.argmax(z3,axis=1)) #每一行最大值的位置
print(np.argmin(z3,axis=0)) #每一列最最小值的位置
print(np.random.randint(10,20,(3,4))) #生成3行4列的10~20的随机整数
#numpy基本运算
f1 = np.arange(12).reshape(3,4).astype(float)
print(f1)
print(np.sum(f1,axis=0)) #按列求和
print(np.sum(f1, axis=1)) #按行求和
print(np.mean(f1,axis=0)) #按列求均值
print(np.median(f1,axis=0)) #按列求中值
print(np.max(f1)) #求矩阵最大值
print(np.min(f1)) #求矩阵最小值
print(np.max(f1,axis=0)) #按列求最大值
print(np.ptp(f1)) #求极值
print(f1.std()) #求标准差
print('*' * 100)

#根据数据的最后一列评论数量绘制直方图
us1_path = "./US_video_data_numbers.csv"
#加载国家数据
us1_data = np.loadtxt(us1_path,delimiter=',',dtype=int)
comments = us1_data[:,-1]
comments = comments[comments<5000]
d = 50
bin_num = (comments.max() - comments.min()) // d
plt.hist(comments, bin_num)
plt.xlabel('评论数量')
plt.ylabel('组数')
plt.show()

#根据评论数和喜欢数绘制散点图,观察二者之间的关系
uk1_path = './GB_video_data_numbers.csv' ;
uk1_data = np.loadtxt(uk1_path,delimiter=',',dtype=int)
uk1_data = uk1_data[uk1_data[:,1]<50000]
t_uk_comments = uk1_data[:,-1]
t_uk_like = uk1_data[:,1]
plt.scatter(t_uk_like,t_uk_comments,color ='r')
plt.xlabel('喜欢数')
plt.ylabel('评论数')
plt.show()


绘制的直方图如下:

绘制的散点图如下:

 

4-python数据处理之pandas

'''
python中的numpy库可以处理数值型数据,但是还是不够的,
因为我们所要考虑不仅仅有数值型数据,还有字符串、时间序列等
因此我们需要使用pandas进行处理相应数据
author:WangGuodong
time:2022-07-15
'''
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import  matplotlib
matplotlib.rc('font', family='YouYuan')

#pandas中常用的数据类型:Series一维带标签的数组,DataFrame二维Series容器
t1 = pd.Series([1,3,4,2,6,5]) #不指定编号,默认从0开始编号
print(t1, type(t1))
print('*' * 100)

#pandas生成一维带标签的数组,并设置标签
t2 = pd.Series([1,2,5,4,6,3], index=list('abcdef'))
print(t2, type(t2))
print('*' * 100)

#pandas通过字典的方式创建数组
temp_dict = 'name' : 'Wang', 'age' : 24, 'tel' : '10086'
t3 = pd.Series(temp_dict)
print(t3)
print(t3[0]) #找到对应位置的值
#通过键找到值
print(t3['name'])
print(t3.get('name'))
#找到键和键的长度
print(t3.index, len(t3.index))
#找到值
print(t3.values)
#找到对应的元素
print(t3[0:3], t3[[0,2]])

#使用pandas读取外部文件,对于一维使用Series,对于二维使用DataFrame
p = pd.read_csv('./ratings.csv') #直接从当前目录下读取全部文件内容,不需要跳过第一行
print(p)
#DataFrame对象是二维的,既有行索引,又有列索引
t4 = pd.DataFrame(np.arange(12).reshape(3,4)) #默认索引
t5 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('xyz'),columns=list('abcd')) #指定索引
print(t4)
print(t5)
print('*' * 100)
#pandas按照字典的方式创建DataFrame数组
d = 'name' : ['Tang', 'Miao'], 'age' : [25, 23], 'Tel' : ['10086', '10087']
print(pd.DataFrame(d)) #指定的键默认为列标
print('*' * 100)
d2 = ['name':'Tang', 'age' : 25, 'Tel' : '10086', 'name' : 'miao', 'Tel':'10087', 'age' : '22', 'Tel':'10089']
print(pd.DataFrame(d2))
print('*' * 100)

#行索引
print(t5.index)
#列索引
print(t5.columns)
print(t5.values) #值
print(t5.shape) #形状
print(t5.head(1)) #显示第一行
print(t5.tail(1)) #显示最后一行
print(t5.info()) #显示关键信息
print(t5.describe()) #显示数字相关信息

'''
对于包含大量名字的数据,我们想知道哪些名字的使用次数比较高,
我们需要进行排序处理,当然我们也可以进行取行和取列操作
'''
df = pd.read_csv('./dogNames2.csv')
#按照动物名字的使用次数进行降序排序
#print(df.head(1))
df = df.sort_values(by='Count_AnimalName',ascending=False)
#取使用次数最高的前20个
print(df[:20])
print(df[:20]['Row_Labels']) #只取名字列
#df.loc通过标签索引行数据
t6 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('wxyz'))
print(t6)
print(t6.loc['a']['z']) #索引对应行列数据
print(t6.loc[:]['w']) #取w列
print(t6.loc['a'][:]) #取a行
print(t6.loc[['a','c']]) #取多行

#df.iloc通过位置索引数据
print(t6.iloc[1])

#需要进行多条件筛选的时候,需要使用布尔索引
dfs = pd.read_csv('./dogNames2.csv')
df1 = dfs[(dfs['Count_AnimalName']>=800) & (dfs['Count_AnimalName']<=1000)]
df2 = dfs[(dfs['Count_AnimalName']>=800) | (dfs['Count_AnimalName']<=1000)]
print(df1)
print('*' * 100)
print(df2)
print('*' * 100)
#找到使用次数大于700且字符串长度大于4的狗的名字
print(dfs[(dfs['Count_AnimalName']>700)& (dfs['Row_Labels'].str.len()>4)])
print('*' * 100)

ts = np.arange(24).reshape(4,6).astype(float)
ts[[0,0,3],[0,5,2]] = np.nan
t8 = pd.DataFrame(ts,index=list('abcd'),columns=list('uvwxyz'))
print(t8)
print('*' * 100)
print(pd.isnull(t8))
print(pd.notnull(t8))
print('*' * 100)
print(t8.dropna(axis=0,how='any')) #删除当前存在nan的行
print(t8.dropna(axis=0,how='all')) #删除当前行中都为nan的行
print(t8.dropna(axis=1,how='any')) #删除当前列存在nan的列
print('*' * 100)
print(t8.fillna(888)) #nan的位置填充888
print('*' * 100)
print(t8.fillna(t8.mean()))#nan的位置填充均值
t8[t8==0] = np.nan  #认为0为缺失值的时候可以赋值nan

#统计方法和字符串离散化
df = pd.read_csv('./IMDB-Movie-Data.csv')
print(df)
print(df.head(1))
print(df.info())
print(df['Rating'].mean()) #获取所有评分的均值
#获取导演的人数,两种方法
print(len(set(df['Director'].tolist())))
print(len(df['Director'].unique()))
#获取演员的人数
temp_actors_list = df['Actors'].str.split(',').tolist()
print(temp_actors_list)
#需要将二维的列表转换成为一维的列表
actors_list = [i for j in temp_actors_list for i in j]
print(len(set(actors_list)))
print('*' * 100)
#电影时长的最大值,最小值,中值等
max_runtime = df['Runtime (Minutes)'].max()
min_runtime = df['Runtime (Minutes)'].min()
median_runtime = df['Runtime (Minutes)'].median()
mean_runtime = df['Runtime (Minutes)'].mean()
print(max_runtime,min_runtime,median_runtime,mean_runtime)
#最大电影时长和最小电影时长的电影对应的索引
max_runtime_index = df['Runtime (Minutes)'].argmax()
min_runtime_index = df['Runtime (Minutes)'].argmin()
print(max_runtime_index,min_runtime_index)
print('*' * 100)

#若知道电影数据,现在想对电影数据的评分、播放时长分别可视化处理
df = pd.read_csv('./IMDB-Movie-Data.csv')
run_data = df['Runtime (Minutes)'].values

max_run = run_data.max()
min_run = run_data.min()
bin_num = (max_run - min_run) // 5

plt.hist(run_data,bin_num)
plt.xticks(range(min_run,max_run+5,5))
plt.xlabel('播放时长')
plt.ylabel('组数')
plt.show()

rating_data = df['Rating'].values
max_rating = rating_data.max()
min_rating = rating_data.min()

plt.hist(rating_data,20)
plt.xlabel('评分')
plt.ylabel('组数')
plt.show()

#数据的合并和分组聚合
#如果给出一组电影数据,我们想知道电影的分类情况
df = pd.read_csv('./IMDB-Movie-Data.csv')
print(df['Genre'].head(3))

#找出分类的二维列表并转换成一维
temp_genre_list = df['Genre'].str.split(',').tolist()
genre_list = list(set([i for j in temp_genre_list for i in j]))

#构造一个全0的数组,然后每个电影出现该分类,则标记1,最后按列求和,即得到每个分类堆的数目
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
for i in range(df.shape[0]):
    zeros_df.loc[i,temp_genre_list[i]] = 1 ; #分类出现则标记为1
genre_df = zeros_df.sum(axis=0) #按列求和
print(genre_df)

x = genre_df.index
y = genre_df.values
plt.figure(figsize=(14,8))
plt.bar(range(len(x)),y)
plt.xticks(range(len(x)),x,rotation=45)

plt.xlabel('电影类别')
plt.ylabel('类别数量')
plt.show()
print('*' * 100)

#下面我们一起看一下数据的合并join和merge的使用
df1 = pd.DataFrame(np.ones((2,4)),index=list('AB'),columns=list('abcd'))
df2 = pd.DataFrame(np.zeros((3,3)),index=list('ABC'), columns=list('xyz'))
print(df1)
print("*" * 100)
print(df2)
print('*' * 100)
print(df1.join(df2)) #按左边的,右边多余的行删除
print('*' * 100)
print(df2.join(df1))#按左边,右边缺少的行用NAN值填充
print('*' * 100)
df3 = pd.DataFrame(np.arange(9).reshape(3,3), columns=list('fax'))
print(df3)
print('*' * 100)

#关于pandas中索引和复合索引的问题
df = pd.read_csv('./starbucks_store_worldwide.csv')
group1 = df[["Brand"]].groupby(by=[df['Country'],df['State/Province']]).count()
print(group1.index)

#使用matplotlib可视化店铺总数排名前10的国家
data1 = df.groupby(by=df['Country']).count()['Brand'].sort_values(ascending=False)[:10]
print(data1)
x = data1.index
y = data1.values
plt.figure(figsize=(16,8),dpi=80)
plt.bar(x,y,color='orange')
plt.xlabel('国家名称')
plt.ylabel('店铺总数')
plt.show()

#使用matplotlib可视化中国每个城市的店铺数目
df = pd.read_csv('./starbucks_store_worldwide.csv')
df = df[df['Country']=='CN']
data2 = df.groupby(by=df['City']).count()['Brand'].sort_values(ascending=False)[:25]
x = data2.index
y = data2.values
plt.figure(figsize=(16,8),dpi=80)
plt.bar(x,y)
plt.xlabel('城市名称')
plt.ylabel('店铺总数')
plt.show()

'''
现在有全球排名靠前的10000本书的数据
可视化不同年份书的数量和评分情况
'''
df = pd.read_csv('./books.csv')
data3 = df[pd.notnull(df["original_publication_year"])]
group3 = data3.groupby(by=df["original_publication_year"]).count()['title']
x = group3.index
y = group3.values
plt.figure(figsize=(16,8), dpi=80)
plt.plot(range(len(x)),y)
plt.xticks(list(range(len(x)))[::10],x[::10].astype(int),rotation=45)
plt.xlabel('年份')
plt.ylabel('书的数量')
plt.show()

#不同年份评分均值
group4 = data3['average_rating'].groupby(by=data3["original_publication_year"]).mean()
x = group4.index
y = group4.values
plt.figure(figsize=(16,8), dpi=80)
plt.plot(range(len(x)),y,color='red')
plt.xticks(list(range(len(x)))[::10],x[::10].astype(int),rotation=45)
plt.xlabel('年份')
plt.ylabel('平均评分')
plt.show()

播放时长的直方图如下:

评分数量的直方图如下:

 电影分类条形图:

 前10名国家的店铺数量可视化如下:

 中国前25个城市的店铺数量可视化:

 不同年份书的数量而可视化:

 不同年份书的平均评分情况可视化:

以上是关于python 基础复习之集合的主要内容,如果未能解决你的问题,请参考以下文章

python基础之列表,字典,集合

Python知识点复习之科研休闲篇

python 面向对象基础和高级复习

Python开发第四篇:Python基础之函数

Python开发第四篇:Python基础之函数

Python开发第四篇:Python基础之函数