基础复习
下载软件与核验:
工欲善其事必先利其器,学习要求下载anaconda和xlrd,并且pandas的版本号不低于1.6。查看pandas的版本的方法:
import pandas as pd
pd.__version__
读取数据(主要以csv, excel为主),txt也可以但是需要正则表达式的知识。
csv读取实列:
df_csv = pd.read_csv('../data/my_csv.csv')
df_csv
csv读取实列:
df_excel = pd.read_excel('../data/my_excel.xlsx')
df_excel
读取txt简易写法:
df_txt = pd.read_table('../data/my_table.txt')
df_txt
公共参数:index_col表示把至少n列作为索引(n为传参的列个数),usecols表示读取列的集合(默认读取所有的列),parse_dates表示需要转化为时间的列,nrows表示读取的数据行数
基本数据结构
Series由四个部分组成,分别是序列的值data、索引index、存储类型dtype、序列的名字name。其中,索引也可以指定它的名字,默认为空。
DataFrame:在Series的基础上增加了列索引,dataframe可以看作是series的集合
基本函数与属性:
columns属性读取列名:
df = pd.read_csv("../data/billboard.csv")
df.columns
head, tail函数分别表示返回表或者序列的前n行和后n行,其中n默认为5:
df.head(10)
df.tail(3)
info, describe分别返回表的信息概况和表中数值列对应的主要统计量 :
特征统计函数(仅常用):sum(求和), mean(平均), median(中位数), std(样品标准偏差), max(最大值), min(最小值)
唯一值函数:
unique和nunique可以分别得到其唯一值组成的列表(unique前必须有列名,否则报错)和唯一值的个数
替换函数:
pandas中的替换函数可以归纳为三类:映射替换、逻辑替换、数值替换。基础分享研究映射替换的replace就好。(写法不单一,用最简单的)
排序函数:
排序共有两种方式,其一为值排序,其二为索引排序,对应的函数是sort_values和sort_index。
apply方法:
官方代码:
DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
实现所有值+1:
df=pd.DataFrame([[1,2]]*3,columns=["A","B"])
df=pd.DataFrame({
"A":[1,2]*2,
"B":[1,2]*2
})
df.apply(lambda x:x+1,axis=0)
注意:apply的自由度很高,但这是以性能为代价的。一般而言,使用pandas的内置函数处理和apply来处理同一个任务,其速度会相差较多,因此只有在确实存在自定义需求的情境下才考虑使用apply
pandas索引
索引器
表的列索引:
通过[列名]可以从DataFrame中取出相应的列,返回值为Series;如果要取出多个列,则可以通过[列名组成的列表],其返回值为一个DataFrame
loc索引器:
l一般形式是loc[r, c],其中第一个r代表行的选择,第二个c代表列的选择,如果省略第二个位置写作loc[r],这个r是指行的筛选.
df = pd.read_csv('../data/movie.csv')
df.dropna(inplace=True)
df.set_index("director_name",inplace=True)
df.loc[["James Cameron"],["color"]]
iloc索引器:
iloc的使用与loc类似,共有五类合法对象,分别是:整数、整数列表、整数切片、布尔列表以及函数,函数的返回值必须是前面的四类合法对象中的一个,其输入同样也为DataFrame本身
查询全部:
df.iloc[:,:]
查询1、2行的第0、1列数据
df.iloc[1:3,0:2]
query方法:
在pandas中,支持把字符串形式的查询表达式传入query方法来查询数据,其表达式的执行结果必须返回布尔列表
比如我们查询索引<=3、duration>=150并且director_name在[“James Cameron”,“Gore Verbinski”]中的可以这么写
df.query(
'(index <= 3)&'
'(duration >= 150)&'
'(director_name in ["James Cameron","Gore Verbinski"] )'
)
分组
分组代码的一般模式:df.groupby(分组依据)[数据来源].使用操作。其中,分组依据可以加布尔表达式进行筛选。后面注释表示其他常用函数:
gb = df.groupby("director_name")
gb.ngroups #分组个数
gb.groups.keys() #分组的字典的key
聚合函数:
内置聚合函数:max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
不满足于内置聚合函数可以使用agg:
官方写法:
DataFrame.agg(func,axis = 0,* args,** kwargs )
其中,func是函数的名字(不要带口号,带口号是调用),axis可以取0和1分别代表行列,后面表示传递的参数
长宽表的变形:
长宽表是对于某一个特征而言的。例如:一个表中把姓名存储在某一个列中,那么它就是关于姓名的长表;如果把姓名作为列名,列中的元素是某一其他的相关特征数值,那么这个表是关于姓名的宽表
pivot语法:
pivot(index=‘i’, columns=‘c’, values=‘想要展示的数值列’)
新生成表的列索引是columns对应列的unique值,而新表的行索引是index对应列的unique值
连接
这里只说最常用的merge以及concat
merge:这里官方参数表可以参考一下:
concat:
这个内容比较多,可能要专门写博客讨论,以下是官方英文文档
官方文档
pandas1.1.0以后的连接函数:
compare:
它能够比较两个表或者序列的不同处并将其汇总展示
缺失数据处理:
缺失数据可以使用isna或isnull(两个函数没有区别)来进行查看,如果需要统计缺失比,则可以在后面加上mean。代码如下:
df.isna().mean()
如果想要同时对几个列,检索出全部为缺失或者至少有一个缺失或者没有缺失的行,可以使用isna, notna和any, all的组合。比如我们要查director_name、color都缺失的行可以这么写:
tmp = df[["director_name","color"]].isna().all()
df[tmp]
说明:如果不存在满足条件的行会报错。
缺失信息的删除:
dropna:
参数为轴方向axis(默认为0,即删除行)、删除方式how(any和all,不同版本这个的默认值不一定一样)、备选的删除子集subset
缺失信息的填充:
fillna:
三个常用参数:value, method, limit。其中,value为填充值,可以是标量,也可以是索引到元素的字典映射;method为填充方法,有用前面的元素填充ffill和用后面的元素填充bfill两种类型,limit参数表示连续缺失值的最大填充次数。
时序数据:
时间模块:
datetime,这个对象含有多个子包,可以实现多个层面的时间操作。
datetime.date可以操作:年月日(可以通过str函数转化为字符串),举个列子:
import datetime
today_ymd = datetime.date.today()
today_ymd
datetime,datetime操作:年月日时分秒,用法同上。不过由于精度原因,这里支持now函数获取当前时间。
时间戳:
单个时间戳的生成利用pd.Timestamp实现,举个列子:
ts = pd.Timestamp('2022/4/19')
ts
这样写的时分秒都是0,我们可以继续补全:
ts = pd.Timestamp('2022-4-19 20:10:20')
ts
时间模块与时间戳的珠联璧合:
上面两个知识点和字符串之间可以互相补足短板以及转化,如下实例:
同时,datetime类型还可以作为索引。