head() tatil()查看前几行、后几行
shape查看形状(成员变量)
column列名(成员变量)
[column for column in df所有列 列名
Pandas读取表格类型的数据
csv、tsv、txt 用逗号分割、tab分割的纯文本文件 pd.read_csv
excel 微软xls或者xlsx文件 pd.read_excel
mysql 关系型数据库表 pd.read_sql
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=["第一列","第二列","第三列"]#自己设定的列名
)
fpath=r"文件路径.xlsx"
ratings=pd.read_excel(fpath)
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)
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数据的方法与访问自字典数据的方法类似:
ss['a']
>>>23
ss[['a','b','c']]
>>>
a 23
b 324
c 896
dtype: int64
DataFrame是一个表格类型的数据
1.列之间可以是不同的数据类型
2.既有行索引index也有列索引columns
3.可以看作由Series组成的字典
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
查看类型
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为列名
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为新的行索引
去除温度的符号后缀
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数组
查询结果:
#查询全年最高温度小于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),:]
#编写函数,查询九月份,空气质量好的数据
def query_my_data(df):
return df.index.str.startswith("2018-09") & df["aqiLevel"]==1
df.loc[query_my_data,:]
直接赋值、apply、assign、分条件赋值
import numpy as np
import pandas as pd
fpath=r"文件路径"
df=pd.read_excel(fpath)
df.head()
修改列
#直接赋值法
#实例:清理温度列,去除℃,变成数字类型
#直接赋值法
#实例:清理温度列,变成字符类型
df.loc[:,"pv"]=df["pv"].str.replace("℃",'').astype('int32')
df.head()
新增列
df.loc[:,'pv-uv']=df['pv']-df['uv']#两Series按照其index相减
df.head()
传给该函数的对象为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(
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"]="温差小"
1.汇总类统计
2.唯一去重和按值计数
3.相关系数和协方差
import numpy as np
import pandas as pd
fpath=r"文件路径"
df=pd.read_excel(fpath)
df.head(3)
>>>
df.loc[:,"bWendu"]=df.loc["bWendu"].str.replace("℃",'').astype('int32')
df.loc[:,"yWendu"]=df.loc["yWendu"].str.replace("℃",'').astype('int32')
df.head(3)
#一下子提取所有数字列统计结果
df.describe()
#查看单个Series的数据
df["bWendu"].mean()
#最高温
df["bWendu"].max()
#最低温
df["bWendu"].min()
df.describe()
统计数据如下:
一般用于非数值列(字符串)
#去重
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()#相关系数矩阵
#单独查看空气质量和最高温度的相关系数
df["api"].corr(df['bWendu'])
#空气质量和温差的相关系数
df['api'].corr[df['bWendu']-df['yWendu']]
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类,检测、丢弃和填充
import pandas as pd
fpath=r"C:\Users\98306\Desktop\test\chenji.xlsx"
studf=pd.read_excel(fpath,skiprows=2)#skiprows=2略过两行读取
studf
studf.isnull()#整体判断是否为null
studf['分数'].isnull()
#筛选没有空分数的行
studf.loc[studf['分数'].notnull(),:]
#删除全是空值的列,直接修改dataframe
studf.dropna(axis="columns",how="all",inplace=True)
studf#第一列的空行就被删除掉了
#删除全是空值的行,直接修改dataframe
studf.dropna(axis="index",how="all",inplace=True)
studf
#字典形式将null替换为0
studf.fillna({'分数':0})
#或者下面这种形式(单个列)
studf.loc[:,'分数']=studf['分数'].fillna(0)
studf.loc[:,'姓名']=studf['姓名'].fillna(method='ffill')#用前一个名字填充
studf
studf.to_excel(r'C:\Users\98306\Desktop\test\chenji.xlsx',index=False)#保存,index=False不保存自动生成的index
import pandas as pd
fpath=r"文件路径"
df=pd.read_csv(fpath)
df.head()
#替换温度后缀
df.loc[:,'bWendu']=df['bWendu'].str.replace("℃",'').astype('int23')
df.loc[:,'yWendu']=df['yWendu'].str.replace("℃",'').astype('int23')
df.head()
Pandas不允许先筛选种子dataframe,再修改写入
要么使用.loc实现一个步骤执行修改
要么先复制一个子dataframe再修改
import pandas as pd
fpath=r"file path"
df=pd.read_excel(fpath)
df.head()
df['pv'].sort_values(ascending=True,inplace=False)#升序排序,False降序,inplace=False不保存
除了对数字类型的元素排序,也能对字符进行排序
#对单列排序
df.sort_values(by='pv')#同时,列的元素,也就是列元素这一行的信息也会排序
#对多列排序
df.sort_values(by=["pv",'uv'],ascending=[False,True])
#列表的第一个元素列作为第一关键字,ascending设置每一列的排序方法
#只有前一个排序时有相同的元素,才会按后面一个排序
df.types查看每一列的数据类型
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():是否匹配特定的正则表达式