Python - Pandas

目录

 

一、1.什么是Pandas(Av67831175,P1)

 二、Pandas怎样读取数据

四、pandas数据查询

 六、pandas数据统计函数

9、Pandas数据进行排序

 10、.Pandas字符串处理

11、.Pandas的axis参数怎么理解

13、Pandas怎样实现数据的Merge

 15、Pandas批量拆分与合并Excel文件

16、Pandas怎样实现groupby分组数据统计


、1.什么是Pandas(Av67831175,P1)

什么是pandas
一个开源的Python类库:用于数据分析、数据处理、数据可视化
高性能
容易使用的数据结构
容易使用的数据分析工具
很方便和其他类库一起使用:
numpy:用于数学计算
scikit-learn:用于机器学习

 二、Pandas怎样读取数据

数据类型 说明 pandas读取方法
csv.tsv.txt 用逗号分隔、tab分隔的纯文本文件 pd.read_csv
excel 微软xls湖综合xlsx文件 pd.read_excel
mysql 关系型数据库表 pd.read_sql


1.pandas读取纯文本文件 代码演示

读取csv文件

读取txt文件

2.pandas读取xlsx格式excel文件

3.pandas读取mysql数据表

import pandas as pd

1.读取纯文本文件

1.1读取csv,使用默认标题行、逗号分隔符

fpath = ""
rating = pd.read_csv(fpath) //使用pd.read_csv读取数据
ratings.head()     //查看前几行数据
ratings.shape      //查看数据的形状,返回(行数、列数)
ratings.columns    //查看列名列表
ratings.index     //查看索引列
ratings.dtypes    //查看每列的数据类型

1.2读取TXT文件,自己指定分隔符、列名
 

1.2读取TXT文件,自己指定分隔符、列名

fpath = ""

pvuv=pd.read_csv(
fpath,
sep='\t',
header=None,
names=['pdate','pv','uv']
)
pvuv

2.读取Excel文件
fpath = ""
pvuv=pd.read_csv(fpath)
pvuv

3.读取MySQL数据库
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
host='root',
password='12345678',
database='test',
charst='utf8',
)
mysql_page=pd.read_sql("selcet * from crazyant_pvuv",con=conn)
mysql_page

 三、pandas数据结构

dataframe:二维数据,整个表格,多行多列

series :一维数据,一行或一列

column :列

row :行

index :索引列

 1.Series

2.DataFrame

3.从DataFrame中查询Series

import pandas as pd
import numpy as np

 1.Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成

1.1仅有数据列表即可产生最简单的series
S1 = pd.Series([1,'a',5.2,7])
s1 //左侧为索引 右侧为数据
s1.index //获取索引
s1.value //获取数据

1.2创建一个具有标签索引的series
S2 = pd.Series([1,'a',5.2,7],index=['d','b','a','c'])
s2
s2.index

1.3使用python字典创建series
sdata={'ohio':35000,'ohio':35000,'ohio':35000,'ohio':35000}
s3.pd.series(sdata)
s3

1.4根据标签索引查询数据
类似培养和天虹的字典dict
s2
s2['a']
type(s2['a'])
s2[['b','a']]
type(s2[['b','a']])

 2.DataFrame

DataFrame是一个表格型数据结构

  • 每列可以是不同的数据类型(数值、字符串、布尔值等)
  • 既有行索引index,也有列索引columns
  • 可以被看做有Series组成的字典

2.1根据多个字典序列创建dataframe
data={
	
	'state':['ohio','ohio','ohio','ohio'],
	'year':[2000,2001,2002,2003],
	'pop':[1.5,2.1,3.4,1.6]
}
df=pd.dataframe(data)
df
df.dtypes
df.columns
df.index

 3.从DataFrame中查询出Series

  • 如果只查询一行、一列,返回的是pd.Series
  • 如果查询多行、多列,返回的是pd.DataFrame

3.1查询一列,结果是一个pd.series
df['year']
type(df['year'])
3.2查询多列,结果是一个pd.dataframe
df[['year','pop']]
type(df[['year','pop']])

3.3查询一行,结果是一个pd.series
df.loc[1]
type(df.loc[1])
3.4查询多行,结果是一个pd.dataframe
df.loc[1:3]
type(df.loc[1:3])

四、pandas数据查询

pandas数据查询的几种方法

1.df.loc方法,根据行、列的标签值查询

2.df.iloc方法,根据行、列的数字位置查询

3.df.where方法

4.df.query方法

.loc既能擦汗讯,又能呢个覆盖写入,强烈推荐

pandas使用df.loc查询数据的方法

1.使用单个label值查询数据

2.使用值列表批量查询

3.使用数值区间进行范围查询

4.使用条件表达式查询

5.使用函数查询

注意:
以上查询方法,既适用于行 也适用于列
注意官产降维dataframe>series>值
import pandas as pd
0、读取数据
数据为北京2018年全年天气预报
df=pd.read_csv("")
df.head()
df.set_index('ymd',inplace=ture) #设定索引为日期 方便按日期筛选
df.index
df.head()
df.loc[:,"bWendu"]=df["bWendu"].str.replace("℃","").astype('int32')
df.loc[:,"yWendu"]=df["yWendu"].str.replace("℃","").astype('int32')
df.dtypes
df.head()


1、使用单个label值查询数据
行或者列,都可以只传入单个值,实现精确匹配
df.loc['2018-01-03','bWendu'] #得到单个值
df.loc['2018-01-03',['bWendu','yWendu']] #得到一个series
2、使用值列表批量查询
df.loc[['2018-01-03','2018-01-04','2018-01-05'],'bWendu'] #得到一个series
df.loc[['2018-01-03','2018-01-04','2018-01-05'],['bWendu','yWendu']] #得到dataframe
3、使用数值区间进行范围查询
df.loc['2018-01-03':'2018-01-04','bWendu'] #行index按区间
df.loc['2018-01-03','bWendu':'fengxiang'] #列index按区间
df.loc['2018-01-03':'2018-01-04','bWendu':'fengxiang'] #行和列都按区间查询
4、使用条件表达式
bool列表的长度 需要  等于行数或者列数

df.loc[df["yWendu"]<-10,:] #简单条件查询,最低温度低于-10度的列表
df["yWendu"]<-10 #观察一下这里的boolean条件
复杂条件查询,查一下完美天气
组合条件用&合并,每个条件判断都需要带括号
df.loc[(df["bWendu"]<=30)&(df["yWendu"]>=15)&(df["tianqi"]<='晴')&(df["aqiLevel"]==1)]
#查询最高温度小于30 并且最低温度大于15 且是晴天 并且天气为优的数据
(df["bWendu"]<=30)&(df["yWendu"]>=15)&(df["tianqi"]<='晴')&(df["aqiLevel"]==1)
#再次观察这里的booleantiaojian 
5、调用函数查询
df.loc[lambda df:(df["bWendu"]<=30)&(df["bWendu"]>=15),:]
#直接写lambda表达式
def query_my_data(df)
 return df.index.str.startswith("2018-09")&df["aqiLevel"]==1
 df.loc[query_my_data,:]

   

 五、pandas新增数据列

在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析

1.直接赋值

2.df.apply方法

3.df.assign方法

4.按条件选择分组 分别赋值

import pandas as pd
0、读取cSV数据到dataframe
fpath = ""

df=pd.read_csv(fpath)
df.head()
1、直接赋值的方法
实例:清理温度列,变成数字类型

df.loc[:,"bWendu"]=df["bWendu"].str.replace("℃","").astype('int32')
df.loc[:,"yWendu"]=df["yWendu"].str.replace("℃","").astype('int32')
#替换温度的后缀℃
df.loc[:,"wencha"]=df["bWendu"]-df["yWendu"]
df.head()
2、df.apply方法
apply a function along an axis of the datafram
object passed to the function are series objects whose index is either 
the dataframe(axis=0)or the dataframe columns(axis=1)
实例:添加一列温度类型
1.如果最高温度大于33度就是高温
2.低于-10度就是低温
3.否则是常温
def get_wendu_type(x)
	if x["bWendu"]>33:
		return '高温'
	if x["bWendu"]<-10:
		return '低温'
df.loc[:,"wendu_type"]=df.apply(get_wendu_type,axis=1)
#设置axis==1 这是series的index是columns
df["wendu_type"].value_counts()
3、df.assign方法
assign new columns to a dataframe
returns a new object with all original columns in addition to new ones
实例:将温度从摄氏度变成华氏度
df.assign(
	yWendu_huashi = lamda x : x['yWendu']*9/5+32,
	bWendu_huashi = lamda x : x['bWendu']*9/5+32
)
#可同事添加多列

4、按条件选择分组分别赋值
按条件先选择数据,然后对这部分数据赋值新列
实例:高低温差大于10度,则认为温差大
#先创建空间 (这是第一种创建新列的方法)
df['wendu_type']=''
df.loc[df["bWendu"]-df["bWendu"]>10,"wendu_type"]="温差大"
df.loc[df["bWendu"]-df["bWendu"]<=0,"wendu_type"]="温差正常"

df["wencha_type"].value_counts()

  

 六、pandas数据统计函数

1.汇总类统计

2.唯一去重和按值计数

3.相关系数和协方差


import pandas as pd
0、读取cSV数据
fpath = ""
 
df=pd.read_csv(fpath)
df.head(3)
1、汇总类统计
df.describe()
df["bWendu"].mean() #查看单个series的数据
df["bWendu"].max() #最高温
df["bWendu"].min() #最低温


2.唯一去重和按值计数
2.1唯一性去重
一般不用于数值列,而是每局、分类列
df.["fengxiang"].unique()
df.["tianqi"].unique()
df.["fengli"].unique()
2.2按值技术
df.["fengxiang"].value_vounts()
df.["tianqi"].value_vounts()

 
 
3.相关系数和协方差
用途:
1.两只股票,是不是同涨同跌?程度有多大?正相关还是负相关?
2.产品销量的波动,跟哪些因素正相关、复相关,程度有多大?
 
对于X、Y:
1.协方差:
衡量同向反向程度,如果协方差为正,说明同向变化,协方差越大说明同向程度越高;
如果协方差为负,说明反向运动,协方差越小反向程度越高
2.相关系数:
衡量相似度程度,当他们的相关系数为1时,说明两个变量变化时的正向相似度最大,
当相关系数为-1时,说明两个变量变化的反向相似度最大
 
df.cov()  //协方差矩阵
df.corr() //相关系数矩阵
df["aqi"].corr(df["bWendu"])//单独查看空气质量和最高温度的相关系数
df["aqi"].corr(df["yWendu"])
df["aqi"].corr(df["bWendu"]-df["yWendu"])//空气质量和温差的相关系数

  

7、pandas对确实数据的处理

  • isnull和notnull:检测是否是空值,可用于df和series
  • dropna:丢弃、删除缺失值
  • axis:删除行还是列,{0 or ‘index’ ,1 or ‘columns’ },default 0
  • how:如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除
  • inplace :如果为true则修改当前df,否则返回新的df

fillna :填充空值

  • value :用于填充的值,可以是单个值,或者字典(key是列名,value是值)
  • method:等于ffill使用前一个不为空的值填充forward fill;等于ffill使用前一个不为空的值填充backward fill
  • axis :按行还是列填充 {0 or ‘index’ ,1 or ‘columns’ }
  • inplace :如果为true则修改当前df,否则返回新的df
import pandas as pd
实例:特殊Excel的读取、清晰、处理
步骤1:读取Excel的时候,忽略前几个空行
studf=pd.read_excel("",skiprows=2)
studf
步骤2:检测空值
studf.isnull()
studf["分数"].isnull()
studf["分数"].notnull()
studf.loc[studf["分数"].notnull(),:]
步骤3:删除全是空值的列
studf.dropna(axis="index",how='all',inplace=ture)
studf
步骤5:将分数列为空的填充为0
studf.fillna({"分数",0}) 
#等同于studf.loc[:,'分数']=studf['分数'].fillna(0)
studf
步骤6:将姓名的缺失值填充
使用前面的有效值填充,用ffill:forward fill
studf.loc[:,'姓名']=studf['姓名'].fillna (method="ffill")
studf
步骤7:将清洗好的Excel保存
studf.to_excel("./data/st_excel.xlsx",index=flase)

 8、Pandas的SettingWithCopyWarning报警

Python - Pandas_第1张图片

 Python - Pandas_第2张图片

 Python - Pandas_第3张图片

 Python - Pandas_第4张图片

 Python - Pandas_第5张图片

 Python - Pandas_第6张图片

9、Pandas数据进行排序

Series的排序:

Series.sort_value(ascending=true ,inplace=false)

ascending : 默认为true升序排序,为false降序排序

inplace :是否修改原始series

DataFrame的排序:

DataFrame.sort_value(by,ascending=True ,inplace=Fals)

by : 字符串或者list<字符串>,单列排序或者多列排序

ascending : bool或者list,升序还是降序,如果是list对应by的多列

inplace :是否修改原始dataframe


import pandas as pd
0、读取数据
fpath=""
df=pd.read_csv(fpath)

df.loc[:,"bWendu"]=df["bWendu"].str.replace("℃","").astype('int32') 
//替换温度的后缀℃
df.loc[:,"yWendu"]=df["yWendu"].str.replace("℃","").astype('int32') 

1、series的排序
df["aqi"].sort_values()
df["aqi"].sort_values(ascending=False)
df["tianqi"].sort_values()

2、dataframe的排序
2.1单列排序
df.sort_values(by="aqi")
df.sort_values(by="aqi",ascending=False)


2.2多列排序
df.sort_values(by=["aqiLevel","bWendu"])
//按空气质量等级、最高温度排序,默认排序
df.sort_values(by=["aqiLevel","bWendu"],ascending=False)
//两个字段都是降序
df.sort_values(by=["aqiLevel","bWendu"],ascending=[True,False])
//分别指定升序和降序

 
10、.Pandas字符串处理

Python - Pandas_第7张图片

 本节演示内容:

1.获取series的str属性,然后使用各种字符串处理函数

2.使用是天然的startwith、contains等bool类series可以做条件查询

3.需要多次str处理的链式操作

4.使用正则表达式的处理

Python - Pandas_第8张图片

 Python - Pandas_第9张图片

 Python - Pandas_第10张图片

Python - Pandas_第11张图片

Python - Pandas_第12张图片

 Python - Pandas_第13张图片


11、.Pandas的axis参数怎么理解

axis=0或者“index”

  • 如果是单行操作,就指的是某一行
  • 如果是聚合操作,指的是跨行cross rows

axis=1或者“columns”

  • 如果是单列操作,就指的是某一列
  • 如果是聚合操作,指的是跨行cross columns
import pandas as pd
import numpy as np

df=pd.dataframe(
	np.arange(12).reshape(3,4),
	columns['A','B','C','D']
)
df
1.单列drop,删除一列
df.drop("A",axis=1)
2.单行drop,删除一行
df.drop("A",axis=0)
3.按axis=0/index执行mean聚合操作
df.mean(axis=0)
4.按axis=1/columns执行mean聚合操作
df.mean(axis=1)
5.再次举例,加深理解
def get_sum_value(x):
return x["A"]+x["B"]+x["C"]+x["D"]
df[""]=df.apply(get_sum_value,axis=1)
df

 
12、Pandas的索引index有什么用途

Python - Pandas_第14张图片

Python - Pandas_第15张图片

 Python - Pandas_第16张图片

 Python - Pandas_第17张图片

 Python - Pandas_第18张图片

Python - Pandas_第19张图片

 Python - Pandas_第20张图片

 Python - Pandas_第21张图片


13、Pandas怎样实现数据的Merge

pandas的merge,相当于sql的join,将不同的表按照key关联到一个表
merge的语法 :
pd.merge(left,right,how='inner',on=none,left_on=None,right_on=None,
left_index=False,right_index=false,sort=ture,suffixes=('_x','_y'),cpoy=ture,
indicator=false,validate=None   )
left,right :要merge的dataframe或者有name的series
how :
on :
left_on,right_on :
left_index,right_index :
suffixes :两个元素的后缀,如果列有重名,自动添加后缀,默认是('_x','_y')
本次讲解提纲:
1.电影数据集的join实例
2,理解merge是一对一、一对多、多对多的数量对齐关系
3.理解left join 、right join 、inner join、outer join的区别
4.出现非key的字段重名情况的处理
 
1、电影数据集的join实例
电影评分数据集
包含文件 :
1.用户对电影的评分数据 rating.dat
2.用户本身的信息数据users.dat
3.电影本身的数据 movies.dat
 
import pandas as pd
 
df_ratings =pd.read_csv()
df_ratings.head() 
df_users =pd.read_csv()
df_users.head() 
df_movies =pd.read_csv()
df_movies.head() 

df_ratings_users = pd.merge(
	df_ratings,df_users,left_on="UserID",right_on="UserID",how="inner"
	)

df_ratings_users.head()
df_ratings_users_movies=pd.merge(
	df_ratings_users,df_movies,left_on="moviesID",right_on="moviesID",how="inner"
)
df_ratings_users_movies.head()

2、理解merge时数量的对齐关系
one-to-one :一对一关系,关联的key都是惟一的
比如(学号,姓名)merge(学号,年龄)
结果条数为:1*1

one-to-many :一对多关系,左边唯一key,右边不唯一key
比如(学号,姓名)merge(学号,[语文成绩、数学成绩、英语成绩])
结果条数为:1*N

many-to-many :多对多关系,左边右边都不是惟一的
比如(学号,[语文成绩、数学成绩、英语成绩])merge(学号,[篮球、足球、乒乓球])
结果条数为:N*N

2.1 one-to-one 一对一关系的merge
left=pd.dataframe({
	'sno':[11,12,13,14],
	'name':['name_a','name_b','name_c','name_d']
})

right=pd.dataframe({
	'sno':[11,12,13,14],
	'age':[21,22,23,24]
})
pd.merge(left,right,on='sno')

2.2 one-to-many 一对多关系(数据会被复制)
left=pd.dataframe({
	'sno':[11,12,13,14],
	'name':['name_a','name_b','name_c','name_d']
})

right=pd.dataframe({
	'sno':[11,11,11,12,12,13],
	'grade':['语文88','数学90','英语75','语文08','数学00','英语75']
})
pd.merge(left,right,on='sno')

2.3 many-to-many 多对多关系
left=pd.dataframe({
	'sno':[11,11,12,12],
	'爱好':['羽毛球','篮球','乒乓球','足球']
})

right=pd.dataframe({
	'sno':[11,11,11,12,12,12],
	'grade':['语文88','数学90','英语75','语文08','数学00','英语75']
})
pd.merge(left,right,on='sno')


3、理解left join、left join、left join、left join的区别

left = pd.dataframe({
	'key':['K0','K1','K2','K3'],
	'A':['A0','A1','A2','A3'],
	'B':['B0','B1','B2','B3']
})

right = pd.dataframe({
	'key':['K0','K1','K4','K5'],
	'C':['C0','C1','C2','C3'],
	'D':['D0','D1','D2','D3']
})
3.1 inner join,默认
左边和右边的key都有,才会出现在结果里
pd.merge(left,right,how='inner')

3.2 lef join
左边的都会出现在结果里,右边的如果无法匹配则为Null
pd.merge(left,right,how='left ')

3.3 right join
右边的都会出现在结果里,左边的如果无法匹配则为Null
pd.merge(left,right,how='right')

3.4 outer join
左边、右边的都会出现在结果里,如果无法匹配则为Null
pd.merge(left,right,how='outer')


4、如果出现非key的字段重名情况

left = pd.dataframe({
	'key':['K0','K1','K2','K3'],
	'A':['A0','A1','A2','A3'],
	'B':['B0','B1','B2','B3']
})

right = pd.dataframe({
	'key':['K0','K1','K4','K5'],
	'A':['A0','A1','A2','A3'],
	'D':['D0','D1','D2','D3']
})

pd.merge(left,right,on='key')
pd.merge(left,right,on='key',suffixes=('_left','_right'))


 。。。。。。。。。。。。。。。。。


14、Pandas实现数据Concat合并

使用场景:
批量合并相同格式的Excel、给dataframe添加行、给dataframe添加列

concat语法:
使用某种合并方式(inner/outer)
沿着某个轴向(axis=0/1)
把多个pandas对象(dataframe/series)合并成一个

concat语法:pandas concat(objs,axis=0,join='outer',ignore_index=false)
objs:
axis:
join:
ignore_index:

append语法:dataframe.append(other,ignore_index=false)
append只有按行合并,
other:
ignore_index:

import pandas as pd
import warnings
warnings.filterwarnings('ignore')

一、使用pandas.concat合并数据

 Python - Pandas_第22张图片

 Python - Pandas_第23张图片

 Python - Pandas_第24张图片

 Python - Pandas_第25张图片

 Python - Pandas_第26张图片

 Python - Pandas_第27张图片

 Python - Pandas_第28张图片

 Python - Pandas_第29张图片

 
15、Pandas批量拆分与合并Excel文件

Python - Pandas_第30张图片

 Python - Pandas_第31张图片

 一、讲一个大excel等份拆分成多个excel

1.使用df.iloc方法,将一个大的dataframe,拆分成多个小dataframe

2.将使用dataframe.to_excel保存每个小excel

1.计算拆分后的每个excel的行数

user_names = ["xiao_shuai","xiao_wang","xiao_ming","xiao_lei","xiao_bo","xiao_hong"]

//大的excel 会拆分给几个人

split_size = total_row_count//len(user_names)

Python - Pandas_第32张图片

 Python - Pandas_第33张图片

 Python - Pandas_第34张图片

 二、

二、合并多个小Excel到一个大Excel
1.遍历文件夹,得到要合并的Excel文件列表
2.分别读取dataframe,给每个df添加一列用于标记来源
3.使用pd.concat进行df批量合并
4.将合并后的dataframe输出到Excel

1.遍历文件夹,得到要合并的Excel文件列表
import os
excel_namaes = []
for excel_name in os.listdir(splits.dir):
	excel_names.append(excel_name)
excel_namaes
2.分别读取dataframe

df_list=[]
for excel_name in excel_names:
	excel_path = f"{}"

Python - Pandas_第35张图片

 Python - Pandas_第36张图片

 Python - Pandas_第37张图片


16、Pandas怎样实现groupby分组数据统计

类似SQL:
select city,max(temperature)from city_weather group by city;
groupby :现对数据分组,然后在每个分组上应用聚合函数、转换函数
本次演示:
一、分组使用聚合函数做函数统计
二、遍历groupby的结果理解执行流程
三、实例分组探索天气数据
import pandas as pd
import numpy as np
df = pd.dataframe({'A':['foo','bar','foo','bar','foo','bar','foo','bar'],
				'B':['one','one','two','three','two','two','two','two'],
				'C':np.random.randn(8),
				'D':np.random.randn(8)

})
一、使用聚合函数做数据统计
1.单个列groupby,查询所有数据列的统计
df.groupby('A').sum()
2.多个列groupby,查询所有数据列的统计
df.groupby(['A','B']).mean()
df.groupby(['A','B'],as_index=False).mean()
3.同事查看多种数据统计
df.groupby('A').agg([np.sum,np.mean,np.std])
4.查看单列的结果数据统计
df.groupby('A')['C'].agg([np.sum,np.mean,np.std]) //预过滤 性能更好
df.groupby('A').agg([np.sum,np.mean,np.std])['C']
5.不同列使用不同的聚合函数
df.groupby('A').agg({"C":np.sum,"D":np.mean})
二、遍历groupby的结果理解执行流程
for循环可以遍历每个group

 Python - Pandas_第38张图片

 Python - Pandas_第39张图片

 Python - Pandas_第40张图片

 Python - Pandas_第41张图片

 Python - Pandas_第42张图片

 Python - Pandas_第43张图片


17、怎样使用Pandas的分层索引MultiIndex


18、怎样使用Pandas的map-apply-applymap数据转换函数


19、Pandas怎样实现groupby每个分组的apply.mp4


20、Pandas使用stack和pivot实现数据透视.mp4


21、Pandas使用apply函数给表格同时添加多列.mp4

你可能感兴趣的:(Python,python,数据挖掘,机器学习)