概述
- 第五章(pandas入门)
- 简介
- Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
- 安装和使用
- pip install pandas
- import pandas as pd
- pandas与NumPy
- 尽管pandas采用了很多NumPy的代码风格,但最大的不同在于pandas是用来处理表格型或者异质性数据的,而NumPy则相仿,他更加适合处理同质性的数值类数组数据
- 中文网站
- https://www.pypandas.cn
- pandas数据结构介绍
- 简介
- 为了入门pandas,你需要熟悉两个常用的工具数据结构:series和DataFrame。尽管它们并不能解决所有的问题,但它们为大多数应用提供了一个有效、易懂的基础。
- Series
- 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
- Series是一种一维的数组型对象,他包含了一个值序列(与NumPy中的类型相似),并且包含了数据标签称为索引。
- 交互式环境中Series的字符串表示,索引在左边,值在右边。由于我们不为数据指定索引,默认生成索引从0到N-1(N是数据的长度),你可以通过values和index属性分别获取Series对象的值和索引
- 与NumPy的数组相比,你可以在从数据中选择数据的时候使用标签index来进行索引:obj[index],obj[[index1,index2]]
- 使用NumPy的函数或者NumPy风格的操作,比如使用布尔值数组进行过滤obj[obj > 2],与标量相乘obj * 2或者是应用数学函数np.exp(obj),这些操作将保存索引值连接
- 你可以认为Series他是一个长度固定切有序的字典,因为它将索引值和数据值按位置配对,在可能会使用到字典的上下文中也是可以使用Series
- 如果你已经 有数据包含在Python字典中,是可以直接生成一个Series pd.Series(字典)
- 当你把字典传递给Series构造函数是,产生的Series的索引将是排序好的字典键。你可以将字典键按照你所想要的顺讯传递给构造函数,从而生成的Series的索引顺序符合你的预期。备注:当索引中不包含字典键时,会排除不包含的字典键值,不包含的索引对应的值将会是NaN 缺失值或者NA(缺失数据)
- isnull、notnull 可以用来检查Series中的缺失值返回Bool数组。pd.isnull(obj)、obj.isnull()
- obj1 + obj2 索引index相同相加,一个存在一个不存在的保留索引index 值为NaN
- series对象自身和其索引都有name属性,这个特性与pandas其他重要功能集成在一起 obj.name = '' ,obj.index.name = ''
- series的索引可以通过按位置赋值的方式进行改变。obj.index = ['i1','i2']
- DataFrame
- DataFrame表示的是矩阵数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)。
- DataFrame既有行索引也有列索引,他可以被视为一个共享相同索引的Series的字典
- 尽管DataFrame是二维的,但你可以利用分层索引在DataFrame中展现更高纬度的数据。(分层索引时pandas中一种更为高级的数据处理特性,我们将在第八章中讨论)
- 基础操作
- 利用包含等长度列表或者Numpy数组字典来构建DataFrame (pd.DataFrame(对象))
- 构建产生的DataFrame会自动为Series分配索引,并且列会按照排序的顺序排列
- 如果使用Jupyter notebook、pandas的DataFrame对象将会展示位一个对浏览器更为友好的HTML表格
- 对于大型的DataFrame,head方法将会值选出头部5行数据进行展示 dfobj.head()
- DataFrame的列可以按照指定顺序排列。pd.DataFrame(data,columns=['列名','列名'])
- 传入列不包含在字典中将会在结果中初选缺失值NaN
- data.columns、data.index 可以获取数据中的行列列表
- 使用操作
- DataFrame中一列,可以按字典标记或者属性那样检索为Series。data['colunm']、data.colunm
- data[colunm]对于任意列名均有效,但是data.column只在列名是有效的Python变量名时才有效
- 注意:返回的Series与袁DataFrame有相同的索引,且Series的name属性也会被合理的设置
- 行可以通过位置或特殊属性loc进行选取。 data.loc[colunm]
- 列的引用可以修改。data[colunm] = 值(当你将列表或者数组赋值给一个列是,值的长度必须和DataFrame的长度匹配。如果你将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排列,并在空缺的地方填充缺失值NaN)
- 如果赋值的列不存在,则会生成一个新的列。(data.column语法是无法创建新列)
- del方法可以用于移除列。del data[column]
- 注意:从DataFrame中选取列的数据的视图,而不是拷贝。因此对Series的修改会映射到DataFrame中。如果需要复制,则应当显式的使用Series的copy方法
- 如果将嵌套字典赋值给DataFrame,pandas会将字典的键作为列,将内部字典的键作为行索引。(无数据会用缺失值NaN补全)
- 可以使用类似NumPy的语法对DataFrame进行转置操作(调换行和列)。data.T
- 内部字典的键被联合、排序后形成了结果的索引。如果已经显式指明索引的话,内部字典键将不会被排序。
- 包含Series的字典也可以用于构造DataFrame
- 和Series类似,DataFrame的values属性将包含在DataFrame中数据以二维ndarray的形式返回
- 如果DataFrame的列是不通dtypes,则values的dtype会自动选择适合所有列的类型
- DataFrame构造函数的有效输入
- 2D ndarray 注释:数据的矩阵,航和列的标签是可选参数
- 数组、列表和元组构成的字典 注释:每个序列称为DataFrame的一列,所有的序列必须长度相等
- NumPy结构化/记录化数组 注释:与数组构成的字典一致
- Series构成的字典 注释:每个值成为一列,每个Series的索引联合起来形成结果的行索引,也可以显式地传递索引
- 字典构成的字典 注释:每一个内部字典称为一列,键联合起来形成结果的行索引
- 字典或Series构成的列表 注释:列表中的一个元素形成DataFrame的一行,字典键或Series索引联合起来形成DataFrame的列标签
- 列表或元组构成的列表 注释:与2D ndarray的情况一致
- 其他DataFrame 注释:如果不显示传递索引,则会使用原DataFrame的索引
- NumPy MaskedArray 注释:与2D ndarray的情况类似,丹隐藏值会在结果DataFrame中称为NA/缺失值
- 索引对象
- pandas中的索引对象是用于存储轴标签和其他元数据的(例如轴名称或者标签)。在构造Series或DataFrame时,你所使用的任意数组或者标签序列都可以在内部转换为索引对象。
- 索引对象是不可变的,用户是无法修改索引对象的。(不变性使得在多种数据结构中分享索引对象更为安全)
- 一些用户并不经常利用索引对象提供的功能,但是因为一些操作会产生包含索引化数据的结果,理解索引如何工作还是特别重要的
- 与Python集合不同,pandas索引对象可以包含重复标签对应的数据。根据重复标签进行筛选,会选取所有重复标签对应的数据。
- 索引对象的方法和属性
- append 将额外的索引对象粘贴到原索引后,产生一个新的索引
- difference 计算两个索引的差集
- intersection 计算两个索引的交集
- union 计算两个索引的并集
- isin 计算表示每一个值是否在传值容器中的布尔数组
- delete 将位置i的元素删除,并产生新的索引
- drop 根据穿参删除指定索引值,并产生新的索引
- insert 在位置i插入元素,并产生新的索引
- is_monotonic 如果索引序列递增则返回True
- is_unique 如果索引序列唯一则返回True
- unique 计算索引的胃一直序列
- 简介
- 基本功能
- 简介
- 主要了解Series和DataFrame中数据交互的基础机制
- 重建索引
- relindex是panadas对象的重要方法,该方法用于创建一个符合新索引的新对象,Series调用reindex方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在则会引入缺失值NaN
- 对于顺序数据,比如时间序列,在重建索引时可能会需要进行插值或者填值。method可选参数允许我们使用诸如ffill等方法在重建索引时插值,ffill方法将会将值前向填充
- 在DataFrame中reindex可以改变行索引、列索引,也可以同时改变二者。行索引参数index,列索引参数columns
- 也可以使用loc进行更为简洁的标签索引。data.loc[[index],[columns]](备注:使用有警告可以忽略,大意是使用loc方法会有keyError异常用reindex替代)
- reindex方法参数
- index 新建作为索引的序列,可以是索引实例或任意其他序列型Python数据结构,索引使用时无需复制
- method 插入值方式;‘ffill’为前向填充,‘bfill’是后向填充
- fill_value 通过重新索引引入缺失数据时使用的替代值
- limit 当前向或者后向填充时,所需填充的最大尺寸间隙(以元素数量)
- tolerance 当前向或者后向填充时,所需填充的不精确匹配下的最大尺寸间隙(以绝对数字距离)
- level 匹配MultiIndex级别的简单索引;否则选择子集
- copy 如果为True,即使新索引等于旧索引,也总是复制底层数据;如果是False,则在索引相同时不要复制数据
- 轴向上删除条目
- 如果你已经拥有索引数组或者不含条目的列表,在轴向上删除一个或者更多的条目就非常容易,但这样需要一些数据操作和集合逻辑,drop方法会返回一个含有指示值或轴向上删除值的新对象
- 在DataFrame中,索引值可以从轴向上删除
- 调用drop时使用标签序列会根据行标签删除值,你可以通过传递axis=1或者axis='columns'来从列中删除值
- drop函数,修改Series或DataFrame的尺寸或形状,使用inplace属性直接操作原对象而不会返回新对象。(很多函数类似)
- 索引、选择与过滤
- Series的索引(obj[....])与NumPy数组索引的功能类似,只不过Series的索引值可以不仅仅是整数。
- 普通的Python切片中是不包含尾部的,Series的切片与之不同(obj['index':'index'])。也可以使用这种方式修改Series相应的部分。
- 使用单个值或序列,可以从DataFrame中索引出一个或者多个列。
- 行选择的语法obj[start:stop].传递单个元素或一个列表到[]符号中可以选择列
- DataFrame可以是对标量进行比较产生的布尔值进行索引
- 使用loc和iloc选择数据
- 针对DataFrame允许你使用轴标签(loc)或整数标签(iloc)以NumPy风格的语法选择数组的行和列的子集
- 通过标签选择除单行多了的数据。obj.loc['行索引',['列索引集合']]
- 通过使用整数标签iloc选择数据。obj.iloc[行下标,[列下标集合]]
- loc还可以通过索引切片来选择数据。obj.loc[start:stop,stat:stop/[数组]]、obj.loc[start:stop,stat:stop/[数组]][判断条件]
- 在早期设计pandas时,我认为使用frame[:,col]来选择一列太过冗余(也容易出错),这是因为列选择是最为常用的操作。我做了设计权衡,将所有的神奇索引行为(包括标签和整数)都放到ix操作符中。事实上,这导致了整数轴标签数据中的许多边缘情况,所以pandas团队决定创建loc和iloc运算符分别用于严格处理基于标签和基于整数的索引。ix索引依然存在,但已经启用。不推荐使用他
- DataFrame索引选项
- df[val] 从DataFrame中选择单列或者列序列;特殊情况的便利:布尔数组(过滤行),切片(切片行)或者布尔值DataFrame(根据某些标量设置的值)
- df.loc[val] 根据标签选择DataFrame的单行或者多行
- df.loc[:,val] 根据标签选择单列或者多列
- df.loc[val1,val2] 同时选择行和列的一部分
- df.iloc[where] 根据整数位置选择单行或者多行
- df.iloc[:,where] 根据整位置选择单列或者多列
- df.iloc[where_i,where_j] 根据整数位置选择行和列
- df.at[label_i,label_j] 根据行、列标签选择单个标量值
- df.iat[i,j] 根据行、列整数位置选择丹哥标量值
- reindex方法 通过标签选择行或者列
- get_value,set_value方法 根据行和列的标签设置单个值
- 整数索引
- 在pandas对象上使用整数索引对新用户来说经常会产生歧义,这是因为他在和在列表、元组等Python内建数据结构上进行索引有些许不同。ser = pd.Series(np.arange(3.))print(ser)# print(ser[-1])(会报错)
- pandas可以“回退”到整数索引,但这个的方式难免会引起一些微小的错误。因为推断用户所需的索引方式(标签索引或者位置索引)是很难的
- 对于非整数索引则不会有潜在的歧义
- 为了保持一致性,如果你有一个包含整数的轴索引,数据选择时请始终使用标签索引。
- 为了更加精确的处理,可以使用loc(用于标签)或iloc(用于整数)
- 算术和数据对齐
- 不同索引的对象之间的算术行为是pandas提供给一些应用的一项重要特性。当你将对象相加时,如果存在某个索引对不相同,则返回结果的索引将是索引对的并集。对数据库用户来说,这个特性类似于索引标签的自动外连接(outer join)。
- 没有交叠的标签位置上,内部数据对齐会产生缺省值NaN。缺省值会在后续的算术操作上产生影响,并且行和列都会执行对齐
- 如果你将两个行或列完全不同的DataFrame对象相加,结果将全部为空
- 使用填充值的算术方法
- 在两个不同的索引化对象之间进行算术操作时,你可能会想要使用特殊填充值,比如当轴标签在一个对象中存在,在另一个对象中不存在时,你想将缺失值填充为0,就要使用对象的方法了
- 使用add方法将另一个对象和一个fill_value座位参数传入就可以填充缺省值。obj.add(obj1,fill_value=0)
- 算术方法中的每一个都以一个以r开头的副本,这些副本方法的参数是翻转的
- 当对Series或DataFrame重建索引时,你也可以指定一个不同的填充值
- Series/DataFrame算术方法
- add,radd 加法(+)
- sub,rsub 减法(-)
- div,rdiv 除法(/)
- floordiv,rfloordiv 整除(//)
- mul,rmul 乘法(*)
- pow,rpow 幂次方(**)
- DataFrame和Series间的操作
- DataFrame和Series间的算术操作与NumPy中不同维度数组间的操作类似。
- arr = np.arange(12.).reshape((3,4))print(arr)print(arr[0])print(arr - arr[0])当我们从arr中减去arr[0]时,减法在每一个行都进行了操作,这就是所谓的广播机制,后续我们将会在附录A中涉及对通用NumPy数组的内容更加深入的解释。DataFrame和Series间的操作时类似的
- 默认情况下,DataFrame和Series的数学操作中会将Series的索引和DataFrame的列进行匹配并广播到各行
- 如果一个索引值不在DataFrame的列中,也不在Series的索引中,则对象会重建索引并形成联合
- 如果你想改为在列上进行广播,在行上进行匹配,你必须使用算术方法。frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])series3 = frame['d']print(series3)print(frame)print(frame.sub(series3, axis='index'))
- 你传递的axis值是用于匹配轴的
- 函数应用和映射
- NumPy的通用函数(逐元素数组方法)对pandas对象也是一样有效的。
- DataFrame的apply方法可以将函数应用到一行或一列的一维数组上:fram = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon']) f = lambda x: x.max() - x.min()print(fram.apply(f))
- 上述的函数f可以计算Series最大值和最小值的差,会被frame中的每一列调用一次。如果你传递axis=‘columns’给apply函数,函数将会被每一行调用一次print(fram.apply(f, axis='columns'))
- 大部分最常用的数组统计(比如sum和mean)都是DataFrame的方法,因此计算统计值时使用apply并不是必须的。传递给apply的函数并不一定要返回一个标量值,也可以返回带有多个值的Series。def f(x): return pd.Series([x.min(), x.max()],index=['min', 'max'])print(fram.apply(f))
- 逐元素的Python函数也可以使用,DataFrame的使用方法是applymap方法。format = lambda x : '%.2f' % xprint(fram.applymap(format))
- 使用applymap作为函数名是因为Series有map方法,可以将一个逐元素的函数应用到Series。
- 排序和排名
- 根据某些准则对数据集进行排序是另一个重要的内建操作。如需按行或者列索引进行字典型排序,需要使用sort_index方法,该方法返回一个新的、排序好的对象。
- 在DataFrame中,你可以在各个轴上按索引排序。数据默认会升序排序,但是也可以按照降序排序。(ascending=False)
- 如果根据Series的值进行排序,使用sort_values方法。默认情况下,所有的缺失值都会被排序至Series的尾部。
- 当对DataFrame排序时,你可以使用一列或多列作为排序键。为了实现这个功能,传递一个或者多个列名给sort_values的可选参数by。
- 排名是指对数据从1到有效数据点总数分配名次的操作。Series和DataFrame的rank方法是实现排名的方法,默认情况下,rank通过将平均排名分配到每个组来打破平级关系。(排名也可以根据他们在数据中的观察顺序进行分配)
- 降序排名使用ascending=False
- 排名中的平级关系打破方法
- ‘average’ 默认:在每个组中分配平均排名
- ‘min’ 对整个组使用最小排名
- ‘max’ 对这个组使用最大排名
- ‘first’ 按照值在数据出现的次序分配排名
- ‘dense’ 类似于method='min',但组间排名总是增加1,而不是一个组中的相等元素的数量
- 含有重复标签的轴索引
- 目前为止我们所见过的示例中,轴索引都是唯一的(索引值)。尽管很多pandas函数(比如reindex)需要标签是唯一的,但这个并不是强制性的。
- 索引的is_unique属性可以告诉我们他的标签是否是唯一的。False不唯一,True唯一
- 带有重复索引的情况下,数据选择是与之前操作有差别的主要情况,根据一个标签索引多个条目会返回一个序列,而丹哥条目会返回一个标量值。
- 简介
- 描述性统计的概述和计算
- 简介
- pandas对象装配了一个常用数学、统计学方法的集合。其中大部分属于归约或汇总拥挤的类别,这些方法从DataFrame的行或列中抽取一个Series或一系列值的单个值(入总和或平均值)。与NumPy数组中的类似方法相比,他们内建了处理缺失值的功能。
- 调用DataFrame的sum方法返回一个包含列上加和的Series。
- 传入axis='columns'或者axis=1,则会将一行上各个列的值相加。
- 除非整个切片上(在本例中是行或者列)都是NA,否则NA值是被自动排除的,可以通过禁用skipna来实现不排除NA值。
- 归约方法可选参数
- axis 归约轴,0位行向,1位列向
- skipna 排除缺失值,默认为True
- level 如果轴是多层索引(MultiIndex),改参数可以缩减分层层级。
- 除了归约方法,有的方法是积累性方法。如:cumsum
- 还有一列方法既不是归约型方法也不是积累型方法。describe一次性产生多个汇总统计
- 描述性统计和汇总统计
- count 非NA值的个数
- describe 计算Series和DataFrame各列的汇总统计集合
- min、max 计算最小值、最大值
- argmin、argmax 分别计算最小值、最大值所在的索引位置(整数)
- idxmin、idxmax 分别计算最小值、最大值所在的索引标签
- quantile 计算样本的从0到1间的分位数
- sum 均加
- mean 均值
- median 中位数(50%分位数)
- mad 平均值的平均绝对偏差
- prod 所有值的积
- var 值的样本方差
- std 值的样本标准差
- skew 样本偏度(第三时刻)值
- kurt 样本峰度(第四时刻)的值
- cumsum 累计值
- cummin、cummax 累计值的最小值或者最大值
- cumprod 值的累计积
- diff 计算第一个算术差值(对时间序列有用)
- pct_change 计算百分比
- 相关性和协方差
- 在一些汇总统计,比如相关性和协方差,是由多个参数计算出的。考虑某些使用附加pandas-datareader库从Yahoo!Finance上获取的包含股价和交易量的DataFrame。
- pandas-datareader安装 pip install pandas_datareader
- 为了获取一些股票行情,使用pandas-datareader模块下载一些数据import pandas_datareader.data as weball_data = {ticker: web.get_data_yahoo(ticker) for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}print(all_data)price = pd.DataFrame({ticker: data['Adj Close'] for ticker ,data in all_data.items()})print(price)volume = pd.DataFrame({ticker: data['Volume'] for ticker,data in all_data.items()})print(volume)
- 计算股价的百分比returns = price.pct_change()print(returns.tail())
- Series的corr方法计算的是两个Series中重叠的、非NA的、按索引对齐的值的相关性,相应的,cov计算的是协方差returns = price.pct_change()print(returns.tail())a = returns['MSFT'].corr(returns['IBM'])print(a)b = returns['MSFT'].cov(returns['IBM'])print(b)由于MSFT是一个有效的Python属性,我们可以使用更为简洁的语法来获得这些数据c = returns.MSFT.corr(returns.IBM)print(c)
- 另一方面,DataFrame的corr和cov方法会分别以DataFrame的形式返回相关协和协方差矩阵print(returns.corr())print(returns.cov())
- 使用DataFrame的corrwith方法,你可以计算出DataFrame中的行或列与另一个序列或DataFrame的相关性。该方法传入一个Series时,会返回一个含有为每列计算相关性值的Series。print(returns.corrwith(returns.IBM))
- 传入一个DataFrame时,会计算匹配到列名的相关性数值。在这里我计算出交易量百分比变化的相关性print(returns.corrwith(volume))
- 传入axis='columns'会逐行地进行计算。
- 唯一值、计数和成员属性
- 另一类相关的方法可以从一维Series包含的数值中提取信息。第一个函数是unique,他会给出Series中的唯一值。
- 唯一值并不一定按照排序好的顺序返回,但是如果需要的话可以进行排序(uniques.sort())。相应的value_counts可以计算出Series包含值的个数。
- 为了方便,返回的Series会按照数量降序排序。value_counts也是有效的pandas顶层方法,可用于任意数组或序列。(pd.value_counts(obj.values,sort=False))
- isin执行向量化的成员属性检查,还可以将数据集以Series或DataFrame一列的形式过滤为数据集的值子集。
- 与isin相关的Index.get_indexer方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组。
- 唯一值、计数和集合成员属性方法
- isin 计算表征Series中每个值是否包含传入序列的布尔值数组
- match 计算数组中每个值的整数索引,形成一个唯一值数组。有助于数据对齐和join类型操作
- unique 计算Series值中的唯一值数组,按照观察顺序返回
- value_counts 返回一个Series,索引时唯一值序列,值是计数个数,按照个数降序排序
- 简介
- 简介
最后
以上就是听话黑米为你收集整理的(自学)利用Python进行数据分析-第五章(pandas入门)的全部内容,希望文章能够帮你解决(自学)利用Python进行数据分析-第五章(pandas入门)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复