目录
。
一、1.什么是Pandas(Av67831175,P1)
二、Pandas怎样读取数据
四、pandas数据查询
六、pandas数据统计函数
9、Pandas数据进行排序
10、.Pandas字符串处理
11、.Pandas的axis参数怎么理解
13、Pandas怎样实现数据的Merge
15、Pandas批量拆分与合并Excel文件
16、Pandas怎样实现groupby分组数据统计
什么是pandas
一个开源的Python类库:用于数据分析、数据处理、数据可视化
高性能
容易使用的数据结构
容易使用的数据分析工具
很方便和其他类库一起使用:
numpy:用于数学计算
scikit-learn:用于机器学习
数据类型 | 说明 | 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是一个表格型数据结构
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
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数据查询的几种方法
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()
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对确实数据的处理
fillna :填充空值
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报警
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])
//分别指定升序和降序
本节演示内容:
1.获取series的str属性,然后使用各种字符串处理函数
2.使用是天然的startwith、contains等bool类series可以做条件查询
3.需要多次str处理的链式操作
4.使用正则表达式的处理
axis=0或者“index”
axis=1或者“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有什么用途
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合并数据
一、讲一个大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)
二、
二、合并多个小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"{}"
类似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
17、怎样使用Pandas的分层索引MultiIndex
18、怎样使用Pandas的map-apply-applymap数据转换函数
19、Pandas怎样实现groupby每个分组的apply.mp4
20、Pandas使用stack和pivot实现数据透视.mp4
21、Pandas使用apply函数给表格同时添加多列.mp4