用处:数据分析、数据处理、数据可视化
和其他类库一起使用
numpy:用于数学计算
scikit-learn:用于机器学习
目录
2.1.1查看dateframe每一列的数据类型df.dtypes
2.1唯一去重(列举枚举值)——df["XXX"].unique()
2.2按值计数(列举枚举值并计数,按降序排)——df["XXX"].value_counts()
常用语法
#返回列数
df.shape[1]
#返回行数
df.shape[0] 或者:len(df)
多行转一行语法
https://blog.csdn.net/qq_41780234/article/details/125324060?spm=1001.2014.3001.5502
下载安装Pandas
下载使用Python类库集成安装包:anaconda
https://www.anaconda.com
pip install pandas
安装备用命令(没有连上python官方镜像源导致的):
pip install pandas -i https://mirrors.aliyun.com/pypi/simple/
一、Pandas怎样读取数据
读取类型:
数据类型 | Pandas读取方法 |
csv\tsv\txt | pd.read_csv |
excel | pd.read_excel |
mysql | pd.read_sql |
1、读取纯文本
1.1 读取csv
fpath = "./datas/ml-latest-small/ratings.csv"
#使用pd.read_csv读取数据
ratings = pd.read_csv(fpath)
#查看前几行数据
ratings.head()
#查看数据的形状,返回(行数、列数),df.shape[1]返回列数,df.shape[0]返回行数
ratings.shape
#共查看列名列表
ratings.columns
#查看索引列
ratings.index
1.2 读取txt,自己指定分隔符、列名
fpath ="./datas/crazyant/access_pvuv.txt"
pvuv = pd.read_csv(
fpath,
sep="\t", #分隔符
header=None,
names=['pdate','pv','uv']
)
print(pvuv)
2、读取EXCEL
fpath = './access_pvuv.xlsx'
pvuv = pd.read_excel(fpath)
3、读取MySQL数据库
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
user='root',
password='12345678',
database='test',
charset='utf8'
)
mysql_page=pd.read_sql("select * from crazyant_pvuv",con=conn)
print(mysql_page)
二、Pandas的2种数据结构
- DataFrame:二维数据,整个表格多行多列
- Series: 一维数据,一行或一列
1、Series
series是一种类似与一维数组的对象,由一组数据以及一组与之相关的数据标签(索引)组成
1.1 仅有的数据列产生最简单的Series
s1 = pd.Series([1,'a',5,7])
左侧索引,右侧列表,结果:
1.2具有索引的Series
s2 = pd.Series([10,'aaa',150,70], index=['年龄','名字','身高','体重'])
左侧索引,右侧列表,结果:
1.3使用Python字典创建Series
dict1 = {"年龄": 10, "性别": "女", "身高": 135}
s3 = pd.Series(dict1)
左侧索引(字典的key),右侧列表(字典的value),结果:
1.4根据标签索引查询数据
类似Python的字典
dict1 = {"年龄": 10, "性别": "女", "身高": 135}
s3 = pd.Series(dict1)
print(s3)
#访问索引对应的值
print(s3['年龄'])
print(type(s3['年龄']))
2、DataFrame
DataFrame是一个表格型的数据结构
每列可以是不同的值类型(数值、字符串、布尔值等)
既有行索引index,也有列索引columns
可以被看做由Series组成的字典
创建dataframe最常用的方法,见02节读取纯文本文件、excel、mysql数据库
2.1根据多个字典序列创建dateframe
# DataFrame
data = {'name': ['Anna', 'Bob', 'Cindy'],
'age': [23, 24, 25],
'tel': ['111', '222', '333'],
}
df = pd.DataFrame(data)
结果:
2.1.1查看dateframe每一列的数据类型df.dtypes
df.dtypes
2.1.2查看列索引df.columns
df.columns
Index(['name', 'age', 'tel'], dtype='object')
2.1.3查看行索引df.index
df.index
RangeIndex(start=0, stop=3, step=1)
2.1.4查询一行/一列
返回的是Series
查询一列
# 查询"name"列
df['name']
查询一行
# 查询第2行
df.loc[1]
2.1.5查询多行/多列
返回的是一个DataFrame
查询多列
# name列和age列
df[['name', 'age']]
查询多行
# 第1-3行
df.loc[0:2]
四、Pandas查询数据的5种方法
1.df.Ioc方法,根据行、列的标签值查询
2.df.iloc方法,根据行、列的数字位置查询
3.df.where方法
4.df.query方法
.Ioc既能查询,又能覆盖写入,强烈推荐!
0、读取数据到dataframe
df = pd.read_csv(fpath)
读取前几行:
df.head()
设定索引为ymd,方便按照日期筛选
df.set_index('ymd', inplace=True)
替换
替换温度的后缀
df.loc[:,"bwendu"] = df["bwendu"].str.replace("℃", "").astype('int32')
查看列的类型
df.dtypes
1、单个label值查询数据
注意:这里'2018-01-03'是行索引
查询2018年1月3日,最高温度的值:
# 得到单个值
df.loc['2018-01-03', 'bwendu']
查询2018年1月3日,最高温度的值和最低温度值:
# 得到一个Series
df.loc['2018-01-03',['bwendu', 'ywendu']]
2、使用值列表批量查询
查询2018年1月3日、2018年1月4日、2018年1月5日的最高温度:
#得到Series
df.loc[['2018-01-03', '2018-01-04', '2018-01-05'], 'bwendu']
查询2018年1月3日、2018年1月4日、2018年1月5日的最高温度和最低温度:
#得到DataFrame
df.loc[['2018-01-03', '2018-01-04', '2018-01-05'], ['bwendu', 'ywendu']]
3、使用数值区间进行范围查询
注意:包含起、始
查询2018年1月3日到2018年1月5日的最高温度:
#行index按区间
#得到Series
df.loc['2018-01-03': '2018-01-05', 'bwendu']
查询2018年1月3日 从'bwendu'到'fengxaing'列:
#列index按区间
#得到Series
df.loc['2018-01-03', 'bwendu': 'fengxiang']
#行index和列index都按区间查询
#得到DateFrame
df.loc['2018-01-03': '2018-01-05', 'bwendu': 'fengxiang']
4、※使用条件表达式查询
bool列表的长度得等于行数或者列数
4.1.简单条件查询,最低温度低于-10度的列表
df.loc[df["ywendu"]<10, :]
#boolean条件
df["bwendu"]<-10 # loc条件查询只会返回True的值
4.2.复杂条件查询:查一下我心中的完美天气
查询最高温度小于30并且最低温度大于15,并且是晴天,并且天气为优的数据
注意:组合条件用&合并,每个条件都要带()括号
#查询最高温度小于30并且最低温度大于15,并且是晴天,并且天气为优的数据
df.loc[(df["bwendu"]<=30)&(df["ywendu"]>=15)&(df["tianqi"]=='晴')&(df["aqiLevel"]==1), :]
5、※?调用函数查询
5.1.直接写lambda表达式
#直接写lambda表达式
df.loc[lambda df:(df["bwendy"]<=30)&(df["ywendu"]>=15), :]
5.2.编写自己的函数传入df
#编写自己的函数,查询9月份空气质量好的数据
def query_my_data(df):
#对于每一行的Series,我们调用他的index,并把他转换成str,
#再在这个str上调用startwith函数
return df.index.str.startswith("2018-09")&df["aqiLevel"]==1
df.loc[query_my_data, :]
注意:函数式编程的本质:函数自身可以像变量一样传递
五、Pandas新增数据列的4种方法
1 直接赋值
2 df.apply方法
3 df.assign方法
4 按条件选择分组分别赋值
0、读取csv数据到dataframe
import pandas as pd
fpath = 'xxx'
df = pd.read_csv(fpath)
1、直接赋值
实例:清理温度列,变成int类型
df.loc[:,"bwendu"] = df["bwendu"].str.replace("℃", "").astype('int32')
df.loc[:,"ywendu"] = df["ywendu"].str.replace("℃", "").astype('int32')
实例:计算温差
两个Series相减,把值赋值给新的列"wencha"
# 注意:df["bwendu"]其实是一个Series,后面的减法返回的也是Series
df.loc[:, "wencha"] = df["bwendu"]-df["ywendu"]
df.head()
2、df.apply方法
Apply a function along an axis of the DataFrame.
Objects passed to the function are Series objects whose index is either the DataFrame's index
(axis=0)or the DataFrame's columns (axis=1).
实例:添加一列温度类型:
最高温度大于30 高温
最低温度小于-10 低温
否则 常温
def get_wendu_type(x):
if x["bwendu"] > 30:
return '高温'
if x["ywendu"] < -10:
return '低温'
return '常温'
#注意:需要设置axis==1,这是series的index是columns
df.loc[:, "wendu_type"] = df.apply(get_wendu_type, axis=1)
axis=1的含义:传递的这个函数是Series ,key是列名
对某一个字段分组计数——df["columns"].value_counts()
查看温度类型的计数
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.
直接把某个列的series的columns传给函数,指定多个键值对的形式:key是新增的列,values是函数
实例:将温度从摄氏度变成华氏度
#可以同时添加多个列
df.assign(
#摄氏度转华氏度
ywendu_h = lambda x : x["ywendu"]*9/5+32,
bwendu_h = lambda x : x["bwendu"]*9/5+32
)
4、按条件选择分组分别赋值
按条件先选择数据,然后对这部分数据赋值新列
实例:高低温差大于10度,则认为温差大
#先创建空列
df["wencha_type"] = ''
df.loc[df["bwendu"]-df["ywendu"]>10,"wencha_type"] = "温差大"
df.loc[df["bwendu"]-df["ywendu"]<=10,"wencha_type"] = "温差正常"
df["wencha_type"].value_counts()
六、Pandas数据统计函数
0、读取csv数据
import pandas as pd
fpath = 'xxx'
df = pd.read_csv(fpath)
df.head(3)
#替换温度后缀
df.loc[:,"bwendu"] = df["bwendu"].str.replace("℃", "").astype('int32')
df.loc[:,"ywendu"] = df["ywendu"].str.replace("℃", "").astype('int32')
1、汇总类统计
提取所有数字列统计结果:
count计数
mean平均值
std标准差
min最小值
25%
50%
75%
max最大值
df.describe()
查看单个Series的数据
#平均值
df["bwendu"].mean()
#最大值
df["bwendu"].max()
#最小值
df["bwendu"].min()
2、唯一去重和按值计数
2.1唯一去重(列举枚举值)——df["XXX"].unique()
一般不用于数据列,而是枚举、分类列
实例:列举该列"fengxiang"所有的枚举值
df["fengxiang"].unique()
2.2按值计数(列举枚举值并计数,按降序排)——df["XXX"].value_counts()
按值分组计数,并降序排列
实例:查询每种风向的次数
df["fengxiang"].value_counts()
3、相关系数和协方差
用途(超级厉害):
1.两只股票,是不是同涨同跌?程度多大?正相关还是负相关?
2.产品销量的波动,跟哪些因素正相关、负相关,程度有多大?
来自知乎,对于两个变量X、Y:
1.协方差:衡量同向反向程度,如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度
越高;如果协方差为负,说明X,Y反向运动,协方差越小说明反向程度越高。
2.相关系数:衡量相似度程度,当他们的相关系数为1时,说明两个变量变化时的正向相似度最
大,当相关系数为-1时,说明两个变量变化的反向相似度最大
3.1 df.cov()协方差矩阵
df.cov()
3.2 df.corr()相关系数矩阵
df.corr()
#单独查看空气质量和最高温度的相关系数
df["aqi"].corr(df["bwendu"])
#单独查看空气质量和最低温度的相关系数
df["aqi"].corr(df["ywendu"])
#查看空气质量和温差的相关系数
df["aqi"].corr(df["bwendu"]-df["ywendu"])
这是特征工程对于机器学习重要性的一个例子!!!