基于关联规则的购物篮分析
上一节
下一节
第一次课 概述与Pandas(上)
(一)了解数据分析
1. 什么是数据分析
2. 数据分析的重要性
3. 数据分析的基本流程
(1)工具
(2)目的
(3)获取数据
(4)数据处理
(5)数据分析
(6)验证结果
(7)结果呈现
(8)数据应用
4. 数据分析常用工具
(二)Python数据分析环境
1. Python的基本介绍
2. 搭建Python开发环境
3. 关于Pycharm
4. 关于Anaconda
5. 关于Jupyter Notebook
6. 关于Spyder
(三)Pandas介绍与应用
1. Pandas 概述
2. Series 对象
3. DataFrame对象
4. 数据导入
5. 数据查询
6. 数据的增、删和修改
7. 数据清洗
8. 数据的索引设置
9. 数据排序与排名
Series 对象
import pandas as pd
s1=pd.Series([88,60,75])
print(s)
import pandas as pd
s1=pd.Series([88,60,75],index=[1,2,3])
s2=pd.Series([88,60,75],index=['明日同学','高同学','七月流火'])
print(s1)
print(s2)
import pandas as pd
s1=pd.Series([88,60,75])
print(s1[0]) #通过一个标签索引获取索引值
import pandas as pd
s1=pd.Series([88,60,75],index=['明日同学','高同学','七月流火'])
print(s1['明日同学']) #通过一个标签索引获取索引值
print(s1[['明日同学','七月流火']]) #通过多个标签索引获取索引值
import pandas as pd
s1=pd.Series([88,60,75],index=['明日同学','高同学','七月流火'])
print(s1['明日同学':'七月流火']) #通过切片获取索引值
import pandas as pd
#位置索引做切片
s2=pd.Series([88,60,75,34,68])
print(s2[1:4])
import pandas as pd
s1=pd.Series([88,60,75])
print(s1.index)
print(s1.values)
DataFrame对象
通过二维数组创建DataFrame
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130]]
index = [0,1,2]
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=index,columns=columns)
print(df)
#遍历DataFrame表格数据的每一列
for col in df.columns:
series = df[col]
print(series)
import pandas as pd
#pd.set_option('display.unicode.east_asian_width',True)data = [[110,105,99],[105,88,115],[109,120,130]]
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data,columns=columns)
print(df)
通过字典创建DataFrame
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)df = pd.DataFrame({'语文':[110,105,99],
'数学':[105,88,115],
'英语':[109,120,130],
'班级':'高一7班'
},index=[0,1,2])
print(df)
导入外部数据
1.常规导入
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)df=pd.read_excel('./data-03/1月.xlsx')df1=df.head() #输出前5条数据
print(df1)
2.导入指定的sheet页
import pandas as pd
df=pd.read_excel('./data-03/1月.xlsx',sheet_name='莫寒')df1=df.head()
print(df1)
3.通过行、列索引导入指定行、列数据
import pandas as pd
df1=pd.read_excel('./data-03/1月.xlsx',index_col=0)print(df1.head())
df2=pd.read_excel('./data-03/1月.xlsx',header=1)print(df2.head())
df2=pd.read_excel('./data-03/1月.xlsx',header=0)print(df2.head())
4.导入指定列数据
import pandas as pd
df1=pd.read_excel('./data-03/1月.xlsx',usecols=[0])df2=pd.read_excel('./data-03/1月.xlsx',usecols=[0,3])df3=pd.read_excel('./data-03/1月.xlsx',usecols=['买家会员名','宝贝标题'])print(df1.head())
print(df2.head())
print(df3.head())
5.导入CSV文件
import pandas as pd
df1=pd.read_csv('./data-03/1月.csv',encoding='gbk')print(df1.head())
6.导入TXT文本文件
import pandas as pd
df1=pd.read_csv('./data-03/1月.txt',sep='\t',encoding='gbk')print(df1.head())
7.导入HTML网页数据
import pandas as pd
df = pd.DataFrame()
url_list = ['http://www.espn.com/nba/salaries/_/seasontype/4']
for i in range(2, 13):
url = 'http://www.espn.com/nba/salaries/_/page/%s/seasontype/4' % i
url_list.append(url)
#遍历网页中的table读取网页表格数据
for url in url_list:
df = pd.concat(pd.read_html(url), ignore_index=True)
#列表解析:遍历dataframe第3列,以子字符串$开头
df = df[[x.startswith('$') for x in df[3]]]print(df)
df.to_csv('NBA.csv',header=['RK','NAME','TEAM','SALARY'], index=False)数据抽取
1.抽取一行数据
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
df1=df.loc['明日']
print(df1)
#df1=df.iloc[0]
2.抽取多行数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
df1=df.loc[['明日','高袁圆']]
print(df1)
#df1=df.iloc[[0,2]]
3.抽取连续多行数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#抽取连续任意多行数据
print(df.loc['明日':'二月二']) #从“明日”到“二月二”
print(df.loc[:'七月流火']) #第1行到“七月流火”
print(df.iloc[0:4]) #第1行到第4行
print(df.iloc[1::]) #第2行到最后1行
4.直接使用列名抽取数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
#抽取指定列数据——直接使用列名
df = pd.DataFrame(data=data, index=name, columns=columns)
df1=df[['语文','数学']]
print(df1)
5.使用loc属性和iloc属性抽取数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#抽取指定列数据——使用loc方法和iloc方法
print(df.loc[:,['语文','数学']]) #抽取“语文”和“数学”
print(df.iloc[:,[0,1]]) #抽取第1列和第2列
print(df.loc[:,'语文':]) #抽取从“语文”开始到最后一列
print(df.iloc[:,:2]) #连续抽取从1列开始到第3列
6.抽取指定行、列数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#抽取指定行列数据
print(df.loc['七月流火','英语']) #“英语”成绩
print(df.loc[['七月流火'],['英语']]) #“七月流火”的“英语”成绩
print(df.loc[['七月流火'],['数学','英语']]) #“七月流火”的“数学”和“英语”成绩
print(df.iloc[[1],[2]]) #第2行第3列
print(df.iloc[1:,[2]]) #第2行到最后一行的第3列
print(df.iloc[1:,[0,2]]) #第2行到最后一行的第1列和第3列
print(df.iloc[:,2]) #所有行,第3列
7.按指定条件抽取数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#按指定条件抽取数据
df1=df.loc[(df['语文'] > 105) & (df['数学'] >88)]
print(df1)
数据的增加、修改和删除
1.按列增加数据
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)data = [[110,105,99],[105,88,115],[109,120,130],[112,115,140]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#1.增加数据——按列增加数据
df['物理']=[88,79,60,50]
#2.增加数据,使用loc方法
#df.loc[:,'物理'] = [88,79,60,50] #在最后插入“物理”一列,其值为等号右边数据
#3.增加数据,使用insert方法
#wl =[88,79,60,50]
#df.insert(1,'物理',wl) #在第1列后面插入“物理”,其值为wl的数值。
print(df)
2.按行增加数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,140]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#按行增加数据,增加一行数据
df.loc['钱多多'] = [100,120,99]
print(df)
#按行增加数据,增加多行数据
df_insert = pd.DataFrame({'语文':[100,123,138],'数学':[120,142,60],'英语':[99,139,99]},index = ['钱多多','童年','无名'])df1 = df.append(df_insert)
print(df1)
3.修改列标题
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,140]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
df.columns=['语文','数学(上)','英语']
print(df)
df.rename(columns = {'语文':'语文(上)','英语':'英语(上)'},inplace = True)print(df)
4.修改行标题
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,140]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
df.index=list('1234')print(df)
#也可以使用rename属性
#df.rename({'明日':1,'七月流火':2,'高袁圆':3,'二月二':4},axis=0,inplace = True)5.修改数据
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)data = [[110,105,99],[105,88,115],[109,120,130],[112,115,140]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#修改整行数据
df.loc['明日']=[120,115,109]
#各科成绩均加10分
df.loc['明日']=df.loc['明日']+10
#修改整列数据
df.loc[:,'语文']=[115,108,112,118]
#修改某一数据
df.loc['明日','语文']=115
#使用iloc方法修改数据
df.iloc[0,0]=115 #修改某一数据
df.iloc[:,0]=[115,108,112,118] #修改整列数据
df.iloc[0,:]=[120,115,109] #修改整行数据
6.删除数据
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,140]]
name = ['明日','七月流火','高袁圆','二月二']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=name, columns=columns)
#删除行列数据
df.drop(['数学'],axis=1,inplace=True) #删除某列
df.drop(columns='数学',inplace=True) #删除columns为“数学”的列
df.drop(labels='数学', axis=1,inplace=True) #删除列标签为“数学” 的列
df.drop(['明日','二月二'],inplace=True) #删除某行
df.drop(index='明日',inplace=True) #删除index为“明日”的行
df.drop(labels='明日', axis=0,inplace=True) #删除行标签为“明日”的行
#删除特定条件的行
df.drop(index=df[df['数学'].isin([88])].index[0],inplace=True) #删除“数学”包含88的行
df.drop(index=df[df['语文']<110].index[0],inplace=True) #删除“语文”小于110的行
7.数据清洗
import pandas as pd
df=pd.read_excel('./data-03/TB2018.xls')print(df)
print(df.info())
#缺失值查看
print(df.isnull())
print(df.notnull())
#删除缺失值
#df1=df.dropna()
#获取宝贝总数量不为空的数据
#df2=df[df['宝贝总数量'].notnull()]
#缺失值填充处理
df['宝贝总数量'] = df['宝贝总数量'].fillna(0)
import pandas as pd
aa =r'./data-03/1月.xlsx'
df = pd.DataFrame(pd.read_excel(aa))
#判断每一行数据是否重复(全部相同),False表示不重复,返回值为True表示重复
print(df.duplicated())
#去除全部的重复数据
print(df.drop_duplicates())
#去除指定列的重复数据
print(df.drop_duplicates(['买家会员名']))
#保留重复行中的最后一行
print(df.drop_duplicates(['买家会员名'],keep='last'))
#inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
print(df.drop_duplicates(['买家会员名','买家支付宝账号'],inplace=False))
索引设置
索引的作用: 1.便于查询数据 2.使用索引可以提升查询性能 3.自动的数据对其功能
import pandas as pd
s1=pd.Series([10,20,30],index=("abc"))s2=pd.Series([2,3,4],index=("bcd"))print(s1+s2)
from pandas import Series
#从pandas引入Series对象,就可以直接使用Series对象了,如Series([88,60,75],index=[1,2,3])
s1=Series([88,60,75],index=[1,2,3])
print(s1)
print(s1.reindex([1,2,3,4,5]))
#重新设置索引,NaN以0填充
print(s1.reindex([1,2,3,4,5],fill_value=0))
print(s1.reindex([1,2,3,4,5],method='ffill')) #向前填充
print(s1.reindex([1,2,3,4,5],method='bfill')) #向后填充
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130]]
index=['mr001','mr003','mr005']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=index,columns=columns)
print(df)
#通过reindex()方法重新设置行索引、列索引和行列索引
print(df.reindex(['mr001','mr002','mr003','mr004','mr005']))
print(df.reindex(columns=['语文','物理','数学','英语']))
print(df.reindex(index=['mr001','mr002','mr003','mr004','mr005'],columns=['语文','物理','数学','英语']))
import pandas as pd
df=pd.read_excel('./data-03/1月.xlsx')df1=df.head()
#设置“买家会员名”为行索引
df=df.set_index(['买家会员名'])
df2=df.head()
import pandas as pd
df=pd.read_excel('./data-03/TB2018.xls')df1=df.dropna()
df2=df.dropna().reset_index(drop=True)
数据排序与排名
import pandas as pd
excelFile = './data-03/mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile))
#按“销量”列降序排序
df=df.sort_values(by='销量',ascending=False)
#按“图书名称”和“销量”列降序排序
df1=df.sort_values(by=['图书名称','销量'])
df1=df.groupby(["类别"])["销量"].sum().reset_index()
df2=df1.sort_values(by='销量',ascending=False)
import pandas as pd
excelFile = './data-03/books.xls'
dfrow = pd.DataFrame(pd.read_excel(excelFile))
#按照索引值为0的行,即第一行的值升序排序
df=dfrow.sort_values(by=0,ascending=True,axis=1)
import pandas as pd
excelFile = './data-03/mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile))
#按“销量”列降序排序
df=df.sort_values(by='销量',ascending=False)
# 顺序排名
df['顺序排名'] = df['销量'].rank(method="first", ascending=False)
df1=df[['图书名称','销量','顺序排名']]
import pandas as pd
excelFile = './data-03/mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile))
#按“销量”列降序排序
df=df.sort_values(by='销量',ascending=False)
#平均排名
df['平均排名']=df['销量'].rank(ascending=False)
df1=df[['图书名称','销量','平均排名']]
#最小值排名
df['最小值排名']=df['销量'].rank(method="min",ascending=False)
df_min=df[['图书名称','销量','最小值排名']]
#最大值排名
df['最大值排名']=df['销量'].rank(method="max",ascending=False)
df_max=df[['图书名称','销量','最大值排名']]

