Pandas学习笔记(一)

Pandas学习笔记一

  • Pandas数组读取
    • 读取csv、tsv、txt文件
    • 读取excel文件
    • 读取mysql数据表
  • Pandas数据结构
    • 创建Series的几种方法
    • 根据标签查询Series数据
    • DataFrame
    • 根据字典序列创建DataFrame
  • Pandas数据查询的五种方法
  • Pandas新增数据列
    • 直接赋值法
    • df.apply方法
    • df.assign方法
    • 按条件选择分组分别赋值
  • Pandas数据统计函数
    • 汇总类统计
    • 唯一去重和按照值计数
    • 相关系数与协方差
  • Pandas对缺失值的处理
  • Setting With Copy Warning报警复现、原因、解决方案
  • Pandas对数据排序
    • 对Series排序
    • 对DataFrame排序
  • Pandas字符串处理
  • Pandas的axis参数
  • Pandas 数据合并concat

head() tatil()查看前几行、后几行
shape查看形状(成员变量)
column列名(成员变量)
[column for column in df所有列 列名

Pandas数组读取

Pandas读取表格类型的数据

csv、tsv、txt   用逗号分割、tab分割的纯文本文件   pd.read_csv
excel          微软xls或者xlsx文件             pd.read_excel
mysql          关系型数据库表                  pd.read_sql

读取csv、tsv、txt文件

import pandas as pd
fpath=r"文件路径.csv"#读取csv文件
ratings=pd.read_csv(fpath)

ratings.head()#显示数据前几行
ratings.shape#返回数据行列数
ratings.columns#返回列名列表
ratings.index#查看索引列
ratings.dtypes#查看每列的数据类型
fpath=r"文件路径.txt"#读取txt文件
ratings=pd.read_csv(
    fpath,#路径
    sep="\t",#设置列分割符
    header=None,#设置无标题行
    names=["第一列","第二列","第三列"]#自己设定的列名
)

Pandas学习笔记(一)_第1张图片

读取excel文件

fpath=r"文件路径.xlsx"
ratings=pd.read_excel(fpath)

Pandas学习笔记(一)_第2张图片

读取mysql数据表

import pymysql
conn=pymysql.connect(
    host="120.0.0.1",
    user="root",
    password="****",#数据库密码
    database="***",#数据库名
    charset="utf8"
)

mysql_page=pd.read_sql("select * from 表名",con=conn)

Pandas数据结构

Pandas学习笔记(一)_第3张图片

创建Series的几种方法

Series是一种类似一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。
import numpy as np
import pandas as pd
#1.由列表创建
s=pd.Series([1,'s',5.2,7])
s
>>>
0      1
1      s
2    5.2
3      7
dtype: object

s.index#获取索引
>>>RangeIndex(start=0, stop=4, step=1)
s.values#获取数据
>>>array([1, 's', 5.2, 7], dtype=object)

#2.创建时指定index
s=pd.Series([1,'s',5.2,7],index=['a','b','c','d'])
s
>>>
a      1
b      s
c    5.2
d      7
dtype: object

# 3.使用字典创建Series
s={'a':23,'b':324,'c':896,'d':853}
ss=pd.Series(s)
ss
>>>
a     23
b    324
c    896
d    853
dtype: int64

根据标签查询Series数据

访问Series数据的方法与访问自字典数据的方法类似:
ss['a']
>>>23
ss[['a','b','c']]
>>>
a     23
b    324
c    896
dtype: int64

DataFrame

DataFrame是一个表格类型的数据
1.列之间可以是不同的数据类型
2.既有行索引index也有列索引columns
3.可以看作由Series组成的字典

根据字典序列创建DataFrame

data={
    'state':['a','b','c','d'],
    'year':[2022,2023,2024,2025],
    'pop':[1.2,1.5,1.7,2.1]
}
df=pd.DataFrame(data)
df

Pandas学习笔记(一)_第4张图片

查看类型

Pandas学习笔记(一)_第5张图片

df.columns#返回列名
>>>
Index(['state', 'year', 'pop'], dtype='object')

df.index#返回行数据
>>>
RangeIndex(start=0, stop=4, step=1)

查询列

#查询一列
df['year']
>>>
0    2022
1    2023
2    2024
3    2025
Name: year, dtype: int64
#查询多列,结果是pd.DataFrame
df[['year','pop']]#和Series相似
>>>
	year	pop
0	2022	1.2
1	2023	1.5
2	2024	1.7
3	2025	2.1

查询行

#查询一行,结果是pd.Series
df.loc[1]
>>>
state       b
year     2023
pop       1.5
Name: 1, dtype: object
#查询多行,结果是pd.DataFrame
df.loc[1:3]#切片包含末尾
>>>
	state	year	pop
1	b	2023	1.5
2	c	2024	1.7
3	d	2025	2.1

查询一列返回Series,index为行名;查询一行也返回Series,index为列名

Pandas数据查询的五种方法

1.df.loc方法,根据行、列的标签查询
2.df.iloc方法,根据行、列的数字位置查询
3.df.where方法
4.df.query方法
.loc既能查询又能写入
Panda使用df.loc查询数据的方法
1.使用单个label查询
2.使用值列表批量查询
3.使用数值区间进行范围查询
4.使用条件表达式查询
5.调用函数查询
---这五种方法既适用于行,又实用于列
df.set_index('列1',inplace=True)#重新设置列1为新的行索引

Pandas学习笔记(一)_第6张图片

去除温度的符号后缀

df.loc[:,"bWendu"]=df["bWendu"].str.replace("℃","").astype(int32)
df.loc[:,"yWendu"]=df["yWendu"].str.replace("℃","").astype(int32)

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-05','bWendu']#行区间

df.loc['2018-01-03','bWendu':'fengxiang']#列区间

df.loc['2018-01-03':'2018-01-05','bWendu':'fengxiang']#行列都为区间

4.使用条件表达式查询

传入bool列表,长度等于行数或列数

#查询全年最低温度低于-10度的列表
df.loc[df["yWendu"]<-10,:]
#df["yWendu"]返回bool数组

查询结果:

Pandas学习笔记(一)_第7张图片

#查询全年最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30)&(df["yWendu"]>=15)&(df['tianqi']=='晴')&(df['aqiLevel']==1),:]

5.调用函数查询

#直接写lambad表达式
df.loc[lambda df:(df['bWendu']<=30) & (df['yWendu']>=15),:]

Pandas学习笔记(一)_第8张图片

#编写函数,查询九月份,空气质量好的数据
def query_my_data(df):
    return df.index.str.startswith("2018-09") & df["aqiLevel"]==1

df.loc[query_my_data,:]

Pandas新增数据列

直接赋值、apply、assign、分条件赋值

直接赋值法

import numpy as np
import pandas as pd
fpath=r"文件路径"
df=pd.read_excel(fpath)
df.head()

Pandas学习笔记(一)_第9张图片

修改列

#直接赋值法
#实例:清理温度列,去除℃,变成数字类型
#直接赋值法
#实例:清理温度列,变成字符类型
df.loc[:,"pv"]=df["pv"].str.replace("℃",'').astype('int32')
df.head()

Pandas学习笔记(一)_第10张图片

新增列

df.loc[:,'pv-uv']=df['pv']-df['uv']#两Series按照其index相减
df.head()

Pandas学习笔记(一)_第11张图片

df.apply方法

传给该函数的对象为Series,沿着DataFrame的某个轴(axis)增加
def get_wendu_type(x):
    if x["bWendu"]>33:
        return '高温'
    if x["yWendu"]<-10:
        return '低温'
    return '常温'
df.loc[:,'wendu_type']=df.apply(get_wendu_type,axis=1)

df.assign方法

#可以同时新增多个列
df.assign(
	yWendu_huashi=lambda x: x['yWendu']*9/5+32,#也可以单独写一个函数,向上面那种
    bWendu_huashi=lambda x: x['bWendu']*9/5+32
)

按条件选择分组分别赋值

#实例:高低温差大于10度,则认为温差大
df['wencha_type']=''#pandas广播机制
df.loc[df['bWendu']-df["yWendu"]>10,"wencha_type"]="温差大"
df.loc[df['bWendu']-df["yWendu"]<=10,"wencha_type"]="温差小"

Pandas数据统计函数

1.汇总类统计
2.唯一去重和按值计数
3.相关系数和协方差
import numpy as np
import pandas as pd

fpath=r"文件路径"
df=pd.read_excel(fpath)
df.head(3)
>>>

Pandas学习笔记(一)_第12张图片

df.loc[:,"bWendu"]=df.loc["bWendu"].str.replace("℃",'').astype('int32')
df.loc[:,"yWendu"]=df.loc["yWendu"].str.replace("℃",'').astype('int32')
df.head(3)

Pandas学习笔记(一)_第13张图片

汇总类统计

#一下子提取所有数字列统计结果
df.describe()

#查看单个Series的数据
df["bWendu"].mean()

#最高温
df["bWendu"].max()

#最低温
df["bWendu"].min()

df.describe()统计数据如下:

Pandas学习笔记(一)_第14张图片

唯一去重和按照值计数

一般用于非数值列(字符串)

#去重
df["fengxiang"].unique
df['tianqi'].unique
df['fengli'].unique
#返回去重的Series
#按值计算
df["fengxiang"].value_counts
df['tianqi'].value_counts
df['fengli'].value_counts
#会按照降序排列这些值出现的次数

相关系数与协方差

协方差:
衡量同向反向程度,如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越大;如果协方差为负,说明X,Y反向变化,协方差越小说明反向程度越大

相关系数:
衡量相似程度,当它们的相关系数为1时,说明两个变量变化的正向相似度最大,当相关系数为-1时,说明两个变量的反向相似度最大

df.cov()#协方差矩阵
df.corr()#相关系数矩阵

Pandas学习笔记(一)_第15张图片

#单独查看空气质量和最高温度的相关系数
df["api"].corr(df['bWendu'])

#空气质量和温差的相关系数
df['api'].corr[df['bWendu']-df['yWendu']]

Pandas对缺失值的处理

Panedas使用这些函数处理缺失值:
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使用前一个不为空的值填充forword fill;等于bill使用后一个不为空的值填充backword fill
    axis:按行还是按列{0 or 'index',1 or 'columns'},default 0
	inplace:如果为True如果为True则修改当前df,否则返回新的df
    
以上函数可以分为3类,检测、丢弃和填充

Pandas学习笔记(一)_第16张图片

import pandas as pd
fpath=r"C:\Users\98306\Desktop\test\chenji.xlsx"
studf=pd.read_excel(fpath,skiprows=2)#skiprows=2略过两行读取
studf

Pandas学习笔记(一)_第17张图片

studf.isnull()#整体判断是否为null
studf['分数'].isnull()

Pandas学习笔记(一)_第18张图片

Pandas学习笔记(一)_第19张图片

#筛选没有空分数的行
studf.loc[studf['分数'].notnull(),:]

Pandas学习笔记(一)_第20张图片

#删除全是空值的列,直接修改dataframe
studf.dropna(axis="columns",how="all",inplace=True)
studf#第一列的空行就被删除掉了

Pandas学习笔记(一)_第21张图片

#删除全是空值的行,直接修改dataframe
studf.dropna(axis="index",how="all",inplace=True)
studf

Pandas学习笔记(一)_第22张图片

#字典形式将null替换为0
studf.fillna({'分数':0})
#或者下面这种形式(单个列)
studf.loc[:,'分数']=studf['分数'].fillna(0)

Pandas学习笔记(一)_第23张图片

studf.loc[:,'姓名']=studf['姓名'].fillna(method='ffill')#用前一个名字填充
studf

Pandas学习笔记(一)_第24张图片

studf.to_excel(r'C:\Users\98306\Desktop\test\chenji.xlsx',index=False)#保存,index=False不保存自动生成的index

Pandas学习笔记(一)_第25张图片

Setting With Copy Warning报警复现、原因、解决方案

import pandas as pd
fpath=r"文件路径"
df=pd.read_csv(fpath)
df.head()

Pandas学习笔记(一)_第26张图片

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

Pandas学习笔记(一)_第27张图片

Pandas学习笔记(一)_第28张图片

Pandas学习笔记(一)_第29张图片

Pandas学习笔记(一)_第30张图片

Pandas学习笔记(一)_第31张图片

Pandas不允许先筛选种子dataframe,再修改写入
要么使用.loc实现一个步骤执行修改
要么先复制一个子dataframe再修改

Pandas对数据排序

Pandas学习笔记(一)_第32张图片

import pandas as pd
fpath=r"file path"
df=pd.read_excel(fpath)
df.head()

Pandas学习笔记(一)_第33张图片

对Series排序

df['pv'].sort_values(ascending=True,inplace=False)#升序排序,False降序,inplace=False不保存

Pandas学习笔记(一)_第34张图片

除了对数字类型的元素排序,也能对字符进行排序

对DataFrame排序

#对单列排序
df.sort_values(by='pv')#同时,列的元素,也就是列元素这一行的信息也会排序

Pandas学习笔记(一)_第35张图片

#对多列排序
df.sort_values(by=["pv",'uv'],ascending=[False,True])
#列表的第一个元素列作为第一关键字,ascending设置每一列的排序方法
#只有前一个排序时有相同的元素,才会按后面一个排序

Pandas学习笔记(一)_第36张图片

Pandas字符串处理

df.types查看每一列的数据类型

Pandas学习笔记(一)_第37张图片

Series.str.isnumeric():判断是否为数字
Series.str.len():字符长度
Series.str.contains():文本是否包含特定的字符串
Series.str.get():获得特定位置处的字符
Series.str.index():获得特定文本在原始文本中的位置即索引,索引从0开始。
Series.str.endswith():文本是否以特定文本结束
Series.str.startswith():文本是否以特定的文本开始
Series.str.find():从文本中查找特定的字符串
Series.str.replace(,):替换文本
Series.str.split():分割文本
Series.str.trip():移除文本开头和结尾的空白格
Series.str.slice():切片
Series.str.match():是否匹配特定的正则表达式

Pandas的axis参数

Pandas学习笔记(一)_第38张图片

Pandas 数据合并concat

Pandas学习笔记(一)_第39张图片

你可能感兴趣的:(pandas,学习,python)