Python数据分析-Pandas
Posted cecilia-2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析-Pandas相关的知识,希望对你有一定的参考价值。
在学习了Numpy后,进行数据科学计算,为何还要使用Pandas呢?其实原因就是效率高,那为何Pandas效率比numpy要高呢?其实Pandas和Numpy还是有着很大的关系的,Pandas本身是依赖numpy的,而ndarray在内存里占据这一段连续的内存空间,任何改变ndarray长度的操作都势必让所有value改变内存中的位置因此在某种程度上,Numpy操作效率还是比较慢的。但是Pandas并不是处理所有的数据都是效率很高的,那么一般情况下处理以下的数据比较友好:
Pandas适合处理多种类型的数据:
- 具有不同数据类型列的表格数据(DataFrame),如SQL表或Excel电子表格。
- 有序或无序(不固定频率)的时间序列数据。
- 带有行和列标签的任意矩阵数据。
- 任何其他形式的观测/统计数据集。
- Pandas主要包含三种数据结构,分别是Series(一维),DataFrame(二维),Panel(三维)。其中Series和DataFrame可以用于处理绝大多数金融,统计,社会科学和许多工程领域的典型问题。
Pandas库是统计科学家在分析数据时的理想工具,非常适合应用于数据清洗,分析/建模,然后将分析结果组织成适合于绘图或表格显示的形式的全部过程。那么其中的优势在哪呢?
优势
- 可以轻易地处理浮点以及非浮点类型的数据的缺失值
- 大小可变:DataFrame和Panel都可以删除和插入
- 灵活强大的分组功能,可对数据集进行拆分组合
- 切片操作,便于索引,存取数据
数据结构
Series:类似于一维数组的对象,由一组数据以及一组相关的数据标签组成的数据结构。可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。
- 创建Series方法——pd.Series
- 获取数组表示形式——obj.values
获取索引对象——obj.index
eg: # 第一种创建series的方式: s1 = pd.Series([1,2,3,4,5,6,7,8,9]) print(s1) print(s1.values) # series的值 print(s1.index) # 索引信息 # 第二种创建series方式: s2 = pd.Series(np.arange(10)) print(s2) # 第三种通过字典的方式创建series: s3 = pd.Series("cecilia":90,'cc':89,'abc':97) print(s3) print(s3.index) s4 = pd.Series(s1.to_dict()) # 转字典 print(s4) s5 = pd.isnull(s3) s5.index.name = "name score" # 给列名添加名称 print(s5)
通过索引存取元素
>>>obj2 = pd.Series([4, 7,-5,3], index=['d','b','a','c']) #还能自定义index进行创建Series >>>obj2 d 4 b 7 a -5 c 3 dtype: int64 >>> obj2.index Index([u'd', u'b', u'a', u'c'], dtype='object') ## 通过索引存取元素和修改元素值 >>>obj2['d']= 6 # 修改index='d'的索引值 d 6 b 7 a -5 c 3 dtype: int64 >>>obj2[['c','a','d']] ## 选取index='c' 'a' 'd'的元素值 c 3 a -5 d 6 dtype: int64 ## 按照索引条件获取元素 >>>obj2[obj2>0] d 6 b 7 c 3 dtype: int64
- 检测缺失数据——pd.innull和pd.notnull
DataFrame:是一个table型数据,包含一组有序的列,每列可以是不同的值类型,DataFrame既有行索引也有列索引,可以看作是由Series组成的字典。dataFrame中的数据是以一个或者多个二维块存放的,而不是列表、字典等。
创建DataFrame
eg: >>> data = 'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9] >>> df = pd.DataFrame(data) >>> print(df) a b c 0 1 4 7 1 2 5 8 2 3 6 9 注意:结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序悱列!!! ## 如果指定了列序列,则DataFrame的列就会按照指定顺序迸行排列,如果指定的列不存在,那么结果是一个空的dataframe >>>pd.DataFrame(data, columns=['b', 'a', 'c']) b a c 0 4 1 7 1 5 2 8 2 6 3 9
存取元素(其实是一个Series)
注意:
- 返冋的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置 好了。行也可以通过位置或名称的方式进行获取。
- 如果采用非整数切片的方式进行选取数据,那么末端的索引对应的数据是包含在内的,而整数切片索引,其末端的索引对应的数据是“含前不含后”。
## 通过字典标记或者属性来获取Series >>> data = 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000, 2001, 2002, 2001, 2002], 'pop':[1.5, 1.7, 3.6, 2.4, 2.9] >>> df= pd.DataFrame(data, columns=['year', 'state', 'pop']) >>> print(df['state']) 0 Ohio 1 Ohio 2 Ohio 3 Nevada 4 Nevada Name: state, dtype: object
ix、loc、iloc
ix——可以通过行号索引,也可以通过行标签索引(从pandas 0.20.0版本开始,官方不推荐使用.ix方法,而是使用.iloc 和.loc方法)
loc——loc[‘d’]表示索引的是第’d’行(index 是字符)通过行标签索引行数据,也可以索引某行某列
iloc——通过行号获取行数据或者多行数据,但是通过行标签获取会报错
## 承接上面的df >> print(df.loc[1]) # 选取第一行的数据 state Ohio year 2001 pop 1.7 Name: 1, dtype: object >> print(df.loc[0:2]) # 选取index=0到index=2行的数据,总共三行数据 state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 ## 可以锁定行,按照特征属性多列选取元素 >> num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'] >> bar_heights = norm_data.loc[0, num_cols].values >> print(bar_heights) [4.3 3.55 3.9 4.5 5.0] ## 重置索引index,通过行号获取数据 >> df.reset_index(inplace=True) >> df.head() >> print(df.iloc[2:4]) # 获取第2行、第3行数据 index state year pop 2 2 Ohio 2002 3.6 3 3 Nevada 2001 2.4
重建索引——reindex()函数:将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值,可以采用填充的方式处理缺失值
有几种参数:
参数 说明 index 用作索引的新序列。既可以是index实例,也 可以是其他序列型的Python数据结构。Index 会被完全使用,就像没有任何复制一样。 method 插值(填充)方式。 fill_value 在重新索引的过程中,需要引入缺失值时使用 的替代值 . limit 前向或后向填充时的最大填充量. level 在Multiindex的指定级别上匹配简单索引,否 则选取其子集 copy 默认为True,无论如何都复制;如果为False, 则新旧相等就不复制 其中method方法的参数如下: 参数 说明 ffill或pad 前向填充(或搬运)值 bfill或backfill 后向填充(或搬运)值
fill_value=0,直接填充0
- 删除任意轴上的索引值——drop(index,axis=1/0)
apply函数——将函数应用到由各列或行所形成的一维数组上,比如sum和mean等
eg: # 将求最大值和最小值之间的差得函数运用在某一轴上 >>>f = lambda x: x.max() - x.min() >>>frame.apply(f) >>>frame.apply(f, axis=1)
排名和排序
- sort_index——对行或列索引进行排序 (按字典顺序)
- order——针对按照值Series排序
- rank——排名,默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的
eg: >>>frame = DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'], columns=['d','a','b','c']) >>>frame.sort_index() >>>frame.sort_index(axis=1) ## 默认的是升序排列,但也可以降序排列 >>>frame.sort_index(axis=1, ascending=False) ## 根据一个或多个列觉得值进行排序,采用**by选项** >>>frame.sort_index(by=['three', 'one']) ## 如要按照值对Series 进行排序,那么可以order >>>obj = Series([4, 7, -3, 2]) >>>obj.order() 2 -3 3 2 0 4 1 7 >>>obj = Series([4, np.nan, 1, np.nan, -3, 2]) >>>obj.order() #在排序时,缺失值默认都会被放到Series的末尾. 4 -3 2 1 5 2 0 4 1 NaN NaN
注意:排名(Series.rank(method=‘average‘,ascending=True))的作用与排序的不同之处在于,他会把对象的values替换成名次(从1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average,min, max, first。
- is_unique——属性验证是否是唯一的
汇总与统计
- sum(axis=1/0)——axis=1按照行求和
- mean(axis=1, skipna=False)——skipna选项可以避免行列存在NA得值进行计算
- idxmin和idxmax,达到最小值或最大值的索引
- describe——用于一次性汇总统计
处理缺失数据得方式
去除
填充
以上是关于Python数据分析-Pandas的主要内容,如果未能解决你的问题,请参考以下文章
小白学 Python 数据分析(11):Pandas 数据分组