pandas库(参考自https://www.jianshu.com/p/6acafa350208
https://blog.csdn.net/zengxiantao1994/article/details/75200110,哔站上也有超多学习视频)
pandas是提供高性能易用数据类型和分析工具,可用于处理csv、tsv、txt、mysql(关系型数据库表)、excel、html等文件
首先先引入
import pandas as pd
1、读取数据(参考自https://www.bilibili.com/video/BV1UJ411A7Fs?p=2)
# 读文件 CSV,文件名为ratings
fpath = ".../ratings.csv" # 写明路径
ratings = pd.read_csv(fpath) # 读取数据
ratings.head() # 查看前几行数据:从左至右为索引,列名,数据体
ratings.shape # 输出行数和列数
ratings.columns # 查看列名列表
ratings.index # 查看索引列
ratings.dtypes # 查看每列的数据类型
# 读取txt文件(由-进行分割而非逗号),文件为pvuv
fpath = ".../access_pvuv.txt"
pvuv = pd.read_csv(
fpath,
sep = "\t" # 指定地址分隔符\t
header = None # 无标记行
names = ['pdate','pv','uv'] # 设置列命名
)
# 读取 excel文件
fpath =
pvuv = pd.read(fpath)
# 读取MySQL
import pymysql
comn = pymysql.commect(
host = '127.0.0.1',
user = 'root',
password = '12345678',
database = 'test',
charset = 'utf8'
)
mysql_page = pd.read_sql("select*from crazyant_pvuv",con = conn) # 第一个为sql语句,第二个为建立一个连接
mysql_page
2、数据结构
有两种数据类型,Series和DataFrame
Series一维数据,一行或者一列
(1)数据列表可产生简单的series(有无标签均可)
(2)字典创建Series
(3)标签索引可以查询
DataFrame为二维数组
(1)根据多个字典序列创建dataframe
(2)从dataframe中查询出series
只查询出一行一列的话返回pd.Series
查询出多行多列的话返回pd.DataFrame
3、数据查询
df.loc方法
(1)使用单个label的值
(2)使用值列表批量查询
(3)使用数值区间进行范围查询
(4)!!!使用条件表达式进行查询!!
返回的是布尔值
(5)调用函数查询
4、新增数据列
(1)直接复制法
温度列有C,要求去掉。把C替换为空。
df.loc[:,"wencha"] = df["bWendu"] - df["yWendu"] # 新增温差列,为最高温减去最低温
(2)df.apply方法
传一个函数返回series
(3)df.assign方法
不修改df本身,返回的是一个新的对象
(4)按条件选择分别赋值
5、数据统计函数
(1)汇总类统计(数值类型)
df.discribe(),可计算出最小值最大值和平均值
平均值:df["列名称“].mean()
最大值:df["列名称“].max()
最小值:df["列名称“].min()
(2)唯一去重和按值列数(不用于数值列,用于枚举、分类列)
去重:df["列名称”].unique
按值计数:df["列名称“].value_counts()
按值计数则为每个名称出现了多少次的统计,会从大到小依次输出。
(3)相关系数和协方差
协方差矩阵:df.cov()
相关系数矩阵:df.corr()
单独查看两列的相关系数:df["列名称”].corr(df["列名称“])
6、Pandas对函数缺失值的处理(https://www.bilibili.com/video/BV1UJ411A7Fs?p=7)
isnull和notnull:检测是否为空
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;等于bfill使用后一个不为空的值填充backword fill
- axis : 按行还是列填充,{0 or ‘index’, 1 or ‘columns’}
- inplace : 如果为True则修改当前df,否则返回新的df
7、SettingWithCopyWarning报警解决方法
8、数据排序
Series:
import pandas as pd
# Series排序
pd.Series.sort_values(ascending=True,inplace=False)
# ascending:默认为True升序排序,False降序排序。inplace:是否修改原始Series
#DataFrame的排序
pd.DataFrame.sort_values(by,ascending=True,inplace=False)
# by:字符串或者list,单列排序或者多列排序;ascending:布尔型或者列表;inplace:是否修改原始DataFrame
# 多列排序
pd.DataFrame.sort_values(by=["列名称"."列名称"])
9、字符串处理
先获取Series的str属性,使用各种字符串处理函数。
应用领域:1.使用str的startwith、contain等bool类Series可以做条件查询。
2.需要多次str处理的链式操作。
3.使用正则表达式的处理。
10、axis参数的理解(https://www.jianshu.com/p/4f18e8327872)
0/index,指某一行,聚合操作则指跨行。1/columns,指某一列,聚合操作则指跨列
import numpy as np
df = pd.DataFrame(
np.arange(12).reshape(3,4),
columns = ['A','B','C','D']
)
df.drop("A", axis=1) # 删除列
df.drop(1, axis=0) # 删除行
df.mean(axis=1) # 指定了哪个axis,这个axis就要动起来,类似被for遍历,其他axis表示不变.1指的是列,为输出某一列的平均数。
df.sum(axis=0) # 求每列数据之和
df.sum(axis=1) # 求每行数据之和
在此注意,在进行了删除、求和、求平均的操作之后,需要把操作结果赋给另一个dataframe的数据。
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.arange(12).reshape(3,4),
columns = ['A','B','C','D']
)
a=df.mean(axis=1)
print(df)
print(a)
结果为:
11、Pandas的索引index的用途
用途:更方便的数据查询;性能的提升;自动数据对齐;更强大的数据结构的支持
(1)查询前五行
df.loc[500].head(5)
(2)提升查询性能:
若index是唯一的,Pandas会用哈希表优化,时间复杂度为O(1)
不唯一的话,会用二分法查询,性能为O(logN)
如果是完全随机的,则每次查询都要扫描全表,查询性能为O(N)
(3)自动对齐,列表相加减时自动对齐
# index自动对齐数据
s1 = pd.Series([1,2,3],index=list("abc"))
s2 = pd.Series([2,3,4],index=list("bcd"))
print(s1+s2)
(4)数据结构支持
CategoricalIndex,基于分类数据的Index,提升性能。
MultiIndex,多维索引,用于groupby多为聚合后结果等。
DatetimeIndex,时间类型索引,强大的日期和时间的方法支持。
12、Merge语法(合并)
merge的数量对齐关系
一对一,关联的关键词均唯一
一对多,关联的关键词左边唯一右边不唯一
多对多,关联的关键词左右均不唯一,结果条数为M*N
四个join的区别
13、Pandas实现数据的合并concat
应用场景:批量合并相同格式的Excel、给DataFrame添加行、给DataFrame添加列。
即:使用某种合并方式(inner/outer)沿着某个轴向(axis=0/1)把多个Pandas对象(DataFrame\Series)合并成一个。
pandas.concat(objs,axis=0,join='outer',ignore_index=False)
# objs指要合并的对象,axis为0时是按行合并,为1时是按列合并。join为对齐方式,ignore_index指是否忽略掉原来的索引。
# append只有按行合并,没有按列合并
DataFrame.append(other,ignore_index=False)
# other指单个dataframe,series,dict或者列表。
使用join=inner过滤掉不匹配的列;使用axis=1相当于添加新列
concat的列表参数非常灵活,可以为series,也可以为dataframe。