在学习了Numpy后,进行数据科学计算,为何还要使用Pandas呢?其实原因就是效率高,那为何Pandas效率比numpy要高呢?其实Pandas和Numpy还是有着很大的关系的,Pandas本身是依赖numpy的,而ndarray在内存里占据这一段连续的内存空间,任何改变ndarray长度的操作都势必让所有value改变内存中的位置因此在某种程度上,Numpy操作效率还是比较慢的。但是Pandas并不是处理所有的数据都是效率很高的,那么一般情况下处理以下的数据比较友好:
Series:类似于一维数组的对象,由一组数据以及一组相关的数据标签组成的数据结构。可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。
获取索引对象——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>>>obj2d 4b 7a -5c 3dtype: int64>>> obj2.indexIndex([u'd', u'b', u'a', u'c'], dtype='object')## 通过索引存取元素和修改元素值>>>obj2['d']= 6 # 修改index='d'的索引值d 6b 7a -5c 3dtype: int64>>>obj2[['c','a','d']] ## 选取index='c' 'a' 'd'的元素值c 3a -5d 6dtype: int64## 按照索引条件获取元素>>>obj2[obj2>0]d 6b 7c 3dtype: int64
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 c0 1 4 71 2 5 82 3 6 9注意:结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序悱列!!!## 如果指定了列序列,则DataFrame的列就会按照指定顺序迸行排列,如果指定的列不存在,那么结果是一个空的dataframe>>>pd.DataFrame(data, columns=['b', 'a', 'c']) b a c0 4 1 71 5 2 82 6 3 9
存取元素(其实是一个Series)
注意:
## 通过字典标记或者属性来获取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 Ohio1 Ohio2 Ohio3 Nevada4 NevadaName: 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 Ohioyear 2001pop 1.7Name: 1, dtype: object>> print(df.loc[0:2]) # 选取index=0到index=2行的数据,总共三行数据 state year pop0 Ohio 2000 1.51 Ohio 2001 1.72 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 pop2 2 Ohio 2002 3.63 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
apply函数——将函数应用到由各列或行所形成的一维数组上,比如sum和mean等
eg:# 将求最大值和最小值之间的差得函数运用在某一轴上>>>f = lambda x: x.max() - x.min()>>>frame.apply(f)>>>frame.apply(f, axis=1)
排名和排序
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 -33 20 41 7>>>obj = Series([4, np.nan, 1, np.nan, -3, 2])>>>obj.order() #在排序时,缺失值默认都会被放到Series的末尾.4 -32 15 20 41 NaNNaN
注意:排名(Series.rank(method='average',ascending=True))的作用与排序的不同之处在于,他会把对象的values替换成名次(从1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average,min, max, first。
汇总与统计
去除
填充
联系客服