介绍
在Python中,pandas是基于numpy数组构建的.使数据预处理,清洗,分析工作变得更快更简单.pandas是专门为处理表格和混杂数据设计的,而numpy更适合处理统一的数值数组数据.
pandas有两个主要的数据结构:series和dataframe
series
series是一种类似于一维数组的对象,它由一组数据(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成,即index和values两部分,可以通过索引的方式选取series中的单个或一组值.
series的创建
pandas.series(list, index=[]),第二个数组是series中数据的索引,可以省略.
- 第一个参数可以是列表或者ndarray.
- 第一个参数可以是字典,字典的键将作为series的索引
- 第一个参数可以使dataframe中的某一行或一列
series类型的操作
series类型索引、切片、运算的操作类似于ndarray,同样的类似Python字典类型的操作,包括保留字操作,使用.get()方法.
series和ndarray之间的主要区别在于series之间的操作会根据索引自动对齐数据.
dataframe
dataframe是一个表格型的数据类型,每列值类型可以不同,时最常用的pandas对象.
dataframe既有行索引也有列索引,它可以被看作由series组成的字典(共用一个索引).
dataframe中的数据是一个以一个或多个二维块存放的(而不是列表,字典,或别的一维数据结构)
dataframe的创建
pandas.dataframe(data, columns=[], index=[])
columns和index为指定的列,行索引,并按照顺序排列
创建dataframe最常用的是直接传入一个有等长列表或numpy数组组成的字典,会自动加上行索引,字典的键会被当做列索引.
如果创建时指定了columns和index索引,则按照索引顺序排列,并且如果传入的列在数据中找不到,就会在结果中产生缺失值(NaN).
另一种常见的创建dataframe方式是使用嵌套字典,如果嵌套字典传给dataframe,pandas就会被解释为外层字典的键作为列,内层字典键则作为行索引.
可以输入给dataframe构造器的数据
| 类型 | 说明 |
|---|---|
| 二维ndarray | 数据矩阵,还可以传入行标和列标 |
| 由数组,列表或元组组成的字典 | 每个序列会被构造成dataframe的一列,所有序列的长度必须相同. |
| numpy的结构化/记录数组 | 类似于"由数组组成的字典". |
| 由series组成的字典 | 每个series会成为一列.如果没有显式指定索引,则各series的索引会被合并成结果的行索引. |
| 由字典组成的字典 | 各内层字典会称为一列.键会被合并成结果的行索引,跟"由series组成的字典"的情况一样. |
| 字典或series的列表 | 各项将会成为dataframe的一行.字典键或series索引的并集将会成为dataframe的列标. |
| 由列表或元组组成的列表 | 类似于"二维ndarray". |
| 另一个dataframe | 该dataframe的索引将会被沿用.除非显式制定了其他索引. |
| numpy的MaskedArray | 类似于"二维ndarray"的情况,只是掩码值在结果dataframe会变成NA/缺失值. |
dataframe对象操作
- dataframe.values:将dataframe转换为ndarray二维数组,是dataframe对象的属性;
- 通过类似字典标记的方式或属性的方式,可以将dataframe的列获取为一个series;
- 列可以通过赋值的方式进行修改;
- 将列表或数组赋值给某个列时,其长度必须跟dataframe的长度相匹配.如果赋值的是一个series,就会精确匹配dataframe的索引,所有空位都将被填上缺失值;
- 为不存在的列赋值会创建出一个新列.
- 关键字del用于删除列
pandas的基本功能
数据索引
series和dataframe的索引是index类型,index对象是不可修改,可通过索引值或索引标签获取目标数据,也可通过索引使序列或数据框的计算,操作实现自动化对齐.索引类型index的常用方法:
- .append(idx):连接另一个index对象,产生新的index对象
- .diff(idx):计算差集,产生新的index对象
- .intersection(idx):计算交集
- .union(idx):计算并集
- .delete(loc):删除loc位置处的元素
- .insert(loc,e):在loc位置增加一个元素
重新索引
能够改变,重排series和dataframe索引,会创建一个新对象,如果某个索引值当前不存在,就引入缺失值.
df.reindex(index, columns, fill_value, method, limit, copy)
参数说明:
- index/columns:为新的行列自定义索引;
- fill_value为用于填充缺失位置的值;
- method为填充方法,ffill当前值向前填充,bfill向后填充;
- limit为最大填充量
- copy默认True,生成新的对象,False时,新旧相等不复制.
删除指定索引
dataframe.drop()能够删除series和dataframe指定的行或列索引.默认返回一个新对象.删除一行或一列时,用单引号指定索引,删除多行时,用列表指定索引.如果删除的是列索引,需要添加axis=1或axis="columns"作为参数.增加inplace=True作为参数,可以就地修改对象,不会返回新的对象.
索引,选取和过滤
dataframe.loc(行标签, 列标签)通过标签查询指定的数据.第一个值作为行标签,第二个值作为列标签.当第二个参数为空时,查询的是单个或多个行的所有列.如果查询多个行,列的话,则两个参数用列表表示.
dataframe.iloc(行位置,列位置)通过默认生成的数字索引查询指定的数据.
在pandas中,有多个方法可以选取和重新组合数据.对于dataframe,如下表总结:
| 类型 | 说明 |
|---|---|
| df[val] | 从dataframe选取单列或一组列;在特殊情况下比较便利:布尔型数组(过滤行),切片(行切片),或布尔型dataframe(根据条件设置值). |
| df.loc[val] | 通过标签,选取dataframe的单个行或一组行 |
| df.loc[:, val] | 通过标签,选取单列或列子集 |
| df.loc[val1, val2] | 通过标签,同时选取行和列 |
| df.iloc[where] | 通过整数索引,从dataframe选取单个行或行子集 |
| df.iloc[:,where] | 通过整数索引,从dataframe选取单个列或列子集 |
| df.iloc[where_i, where_j] | 通过整数索引,同时选取行和列 |
| df.at[label_i, label_j] | 通过行和列标签,选取单一的标量 |
| df.iat[i,j] | 通过行和列的位置(整数),选取单一的标量 |
| reindex | 通过标签选取行或列 |
| get_value,set_value | 通过行和列标签选取单一值 |
算数运算
算数运算根据行列索引,对齐后运算,运算默认产生浮点数,对齐时缺项自动填充NaN.除了用±*/外,还可以用series和dataframe的算数方法,这些方法传入fill_value参数时,可以填充缺省值.比如df1.add(df2, fill_value=1):
| 方法 | 说明 |
|---|---|
| add, radd | 加法 |
| sub, rsub | 减法 |
| div, rdiv | 除法 |
| floordiv, rfloordiv | 底除 |
| mul, rmul | 乘法 |
| pow, rpow | 幂 |
比较运算
只能比较相同索引的元素,比进行补齐.采用<,>,<=,>=,==,!=等符号进行的比较运算,产生布尔值.
排序
在排序时,任何缺失值默认都会被放到末尾
dataframe.sort_index(axis=0, ascending=True)根据指定轴索引的值进行排序,默认axis=0
ascending=True,升序排序,False降序排序.默认升序
series.sort_values(axis=0, ascending=True)只能根据-轴进行排序
dataframe.sort_values(by,axis=0,ascending=True)参数by为axis轴上的某个索引或索引列表
pandas数据分析
统计分析,相关分析
适用于series和dataframe的基本统计分析函数,传入axis='columns’或axis=1将会按行进行运算.
dataframe.describe()针对各列的多个统计汇总,用统计学指标快速描述数据的概要
dataframe.sum()计算各列数据的和
dataframe.count()非NaN值的数量
dataframe.mean()/median()计算数据的算数平均值,算数中位数
dataframe.var()/std()计算数据的方差,标准差
dataframe.corr()/cov()计算相关系数矩阵,协方差矩阵,是通过参数对计算出来的.series的corr方法用于计算两个series中重叠的,非NaN的,按索引对齐的值的相关系数.dataframe的corr和cov方法将以dataframe的形式分别返回完整的相关系数或协方差矩阵.
dataframe.corrwith()计算某列或行跟另一个series或dataframe之间的相关系数.传入一个series将会返回一个相关系数指series,传入一个dataframe则会计算按列名配对的相关系数.
dataframe.min()/max()计算最小值,最大值
dataframe.diff()计算一阶差分,对时间序列有效
dataframe.mode()计算众数,返回频数最高的那(几)个
dataframe.mean()计算均值
dataframe.quantile()计算分为数(0到1)
dataframe.isin()用于判断矢量化集合的成员资格,可用于过滤series中或dataframe列中数据的子集.适用于series的基本统计分析函数,dataframe[列名]返回的是一个series类型.
dataframe.unique()返回一个series中的唯一值组成的数组
dataframe.value_counts()计算一个series中各值出现的频率
dataframe.argmin()/argmax()计算数据最小值、最大值的索引(自动索引)
dataframe.idxmin()/idxmax()计算数据最小值、最大值的索引(自定义索引)
分组
dataframe.groupby()分组函数,使用方法参考:
https://blog.csdn.net/cymy001/article/details/78300900
pandas.count()根据数据分析对象的特征,按照一定的数值指标,把数据分析对象划分为不同的区间部分来进行研究,以揭示其内在的联系和规律性.类似给成绩设定优良中差,比如:0-59为差,60-70为中,71-80为优秀等等.使用方法参考:
https://blog.csdn.net/weixin_39541558/article/details/80578529
https://blog.csdn.net/missyougoon/article/details/83986511
pandas读写文本格式的数据
pandas提供了一些用于将表格型数据读取为dataframe对象的函数.下表对它们进行了总结,其中read_cav(),read_table(),to_csv()是用的最多的.
| 函数 | 说明 |
|---|---|
| read_csv() | 从文件,URL,文件型对象中加载带分隔符的数据.默认分隔符为逗号. |
| read_table() | 从文件,URL,文件型对象中加载带分隔符的数据.默认分隔符为制表符’\t’ |
| read_fwf() | 读取定宽列格式数据(也就是说,没有分隔符) |
| read_clipboard() | 读取剪贴板中的数据,可以看做read_table的剪贴板版,在将网页转换为表格时很有用. |
| read_excel() | 从excel xls或xlsx file 读取表格数据 |
| read_hdf() | 读取pandas写的HDF5文件 |
| read_html() | 读取HTML文档中的所有表格 |
| read_json() | 读取JSON字符串中的数据 |
| read_msgpack() | 读取二进制格式编码的pandas数据 |
| read_pickle() | 读取Python pickle格式中存储的任意对象 |
| read_sas() | 读取存储于SAS系统自定义存储格式的SAS数据集 |
| read_sql() | 使用SQL Alchemy读取SQL查询结果为pandas的dataframe |
| read_stata() | 读取stata文件格式的数据集 |
| read_feather() | 读取feather二进制文件格式 |
工作中实际碰到的数据可能十分混乱,一些数据加载函数的参数非常多.例如read_csv()有超过50个参数.参考:https://seancheney.gitbook.io/python-for-data-analysis-2nd/di-06-zhang-shu-ju-jia-zai-cun-chu-yu-wen-jian-ge-shi
用pandas来进行数据清洗和准备
在数据分析和建模的过程中,相当多的时间要用在数据准备上:加载,清理,转换以及重塑.
处理缺失数据
在许多数据分析工作中,缺失数据是经常发生的.对于数值数据,pandas使用浮点值,NaN(np.nan)表示缺失数据,也可将缺失值表示为NA(Python内置的None值).
dataframe.info()查看数据的信息,包括每个字段的名称,非空数量,字段的数据类型.
dataframe.isnull()返回一个同样长度的值为布尔型的对象(series或dataframe),表示哪些值是缺失的,.notnull()为其否定形式.
dataframe.dropna()删除缺失数据.对于series对象,dropna返回一个仅含非空数据和索引值的series.对于dataframe对象,dropna默认删除含有缺失值的行;如果想删除含有缺失值的列,徐传入axis=1作为参数.如果想删除全部为缺失值的行或者列,徐传入how='all'作为参数;如果想留下一部分缺失数据,徐传入thresh=n作为参数,表示每行至少n个非NA值.
dataframe.fillna(value, method, limit, inplace)填充缺失值.
- value为用于填充的值(比如0,'a’等),或者是字典(比如{‘列’:1, ‘列’:8,…}为指定列的缺失数据填充值);
- method默认为ffill,向前填充,向后填充bfill;
- limit为向前或向后填充的最大填充量.
- inplace默认返回新对象,传递
inplace=True参数,可以实现对现有对向的就地修改.
数据转换
替换值
dataframe.replace(old, new)用新的数据替换旧的数据,如果希望一次性替换多个值,old和new可以使列表.默认会返回一个新的对象,传入inplace=True实现就地修改.
删除重复数据
dataframe.duplicated()判断各行是否是重复行(前面出现过的行),返回一个布尔型series.
dataframe.drop_duplicstes()删除重复行.返回删除后的dataframe对象.默认保留的是第一个出现的行.传入keep='list'参数,则保留最后一个出现的行.
两者都默认会对全部列做判断,在传入列索引组成的列表[‘列1’,‘列2’,…]作为参数后,可以只对这些列进行重复项判断.
利用函数或字典进行数据转换
series.map()接收一个函数或字典作为参数.使用map()方法是一种实现元素级转换以及其他数据清理工作的便捷方式.
dataframe的常见函数
dataframe.head()查询数据的前五行
dataframe.tail()查询数据的末尾五行
pandas.cut()设置区间,比如成绩信息的优良中差
pandas.qcut()基于分位数的离散化函数.基于秩或基于样本分位数将变量离散化为等大小桶
pandas.data_range()返回一个时间索引
dataframe.apply()沿相应轴应用函数
series.value_counts()返回不同数据的计数值
dataframe.aggregate()
dataframe.reset_index()重新设置index,参数drop=True时会丢弃原来的索引,设置新的从0开始的索引.常与groupby()一起用.
numpy.zeros()
参考文献:https://www.jianshu.com/p/840ba135df30

这篇博客介绍了Python数据分析库pandas的基础知识,包括series和dataframe两种核心数据结构的创建与操作,如索引、切片、运算。此外,还讨论了pandas的基本功能,如数据索引、统计分析、分组、数据清洗,以及读写文本格式数据的方法。

1939

被折叠的 条评论
为什么被折叠?



