版权声明:转载请联系博主。 https://blog.csdn.net/sunyaowu315/article/details/82743961
目录:
一 pandas及其重要性
- pandas是数据分析工作的首选库。它含有使数据分析工作变得更快更简单的高级数据结构和操作工具。
- pandas是基于Numpy构建的让以Numpy为中心的应用变得更加简单。
- 它能满足工作中的许多需求:
① 具备按轴自动或显式数据对齐功能的数据结构。防止由于数据未对齐导致的常见错误。
② 集成时间序列功能。
③ 技既能处理时间序列也能处理非时间序列数据的数据结构。
④ 数学运算和简约(agg),可以根据不同的元数据(轴编号)处理。
⑤ 灵活处理缺失数据。
⑥ 合并及其他出现在常见数据库中的关系型运算。 - pandas可以解决的数据问题随着它的库规模的增大而变得更加强大,成为数据分析一个不可或缺的工具。
二 pandas的数据结构介绍
1 Series
- Series是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。由一组数据即可产生最简单的Series。
- Series的字符串表现形式为:索引在左边,值在右边。自动创建一个0~N-1的整数型索引,可以通过values和index属性获取其数组表示形式和索引对象。
obj = Series([4,7,-5,3])
obj.index
obj.values
- 可以通过索引的方式选取Series的单个或者一组值。
obj['one'] = 1
- 数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)会保留索引与值之间的链接。
obj[obj > 0]
obj * 2
np.exp(obj)
- 可以将Series看作一个定长的有序字典,索引到值之间是一个映射。
'a' in obj
- 如果数据被存放在一个python字典中,也可以直接通过这个字典创建Series。
data = {'one':1,'two':2,'three':3}
obj = Series(data)
- 如果只传入一个字典,则结果Series的索引就是原字典的键(有序排列)。
- Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。
- Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:
obj.name = ' population'
obj.index.name = 'state'
obj.index = ['one','two','three','four'] #通过赋值的方式修改索引
2 DataFrame
- DataFrame是一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
- DataFrame既有行索引也有列索引,可以被看做是Series组成的字典(共同用一个索引)。DataFrame面向行和列的操作基本上是平衡的。
- DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。也可以轻松地将其表示为更高维度的数据(层次化索引的表格型结构,高级数据处理功能的关键要素)。
- 构建DataFrame的方法①:直接传入一个由等长列或Numpy数组组成的字典。
data = ({'':[],
'':[]
'':[]})
frame = DataFrame(data)
- 结果DataFrame会自动加上索引,且全部列会被有序排列。
- 如果指定了列序列,则DataFrame的列会按照指定顺序进行排列。
DataFrame(data,columns = ['one','two','three'])
frame = DataFrame(data,columns = [],index = [])
frame.columns
- 如果传入的数据找不到,就会产生NA值
- 通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
frame['one']
frame.one
- 返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应的设置好。
- 行也可以通过位置或名称的方式就行获取,比如用索引字段ix。
frame.ix['1']
- 列可以通过赋值的方式进行修改。
- 为不存在的列赋值会创建一个新列。
frame['new'] = 1 #新增一个空列,并赋一个标量值
frame['new'] = np.arange(5.) #新增一个空列,并赋一个标量值
- 将列表或数组赋值给某个列时,其长度必须跟DataFrame 长度相匹配。如果是Series,会精确匹配DataFrame的索引,空位被缺失值填补。
Series = Series([1,2,3],index = ['one','two','three'])
frame['new'] = Series
- 构建DataFrame的方法②:嵌套字典(字典的字典)
- 如果将嵌套字典传递给DataFrame,它会被解释为:外层字典的键作为列,内层键则作为行索引。
- 内层字典的键会被合并、排序以形成最终 的索引。除非显式指定了索引。
- 可以输入给DataFrame构造函数所能接受的各种数据
- 二维ndarray #数据矩阵,还可以传入行标和列标。
- 由数组、列表或元组组成的字典 #每个序列会变成DataFrame的一列,所有序列的长度必须相同。
- Numpy的结构化/记录数组 #类似于“由数组组成的字典”
- 由Series组成的字典
- 由字典组成的字典
- 字典组成的Series列表
- 列表或元组组成的另一个DataFrame
- Numpy的MaskedAarry
- 如果设置了DataFrame的index和columns属性,这些信息会被现显示出来。
- 跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据。
- 如果DataFrame各列的数据类型不同,则值数组的数据类型会选用能够兼容所有列的数据类型。
3 索引对象
- pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签会被转换成一个index
- index对象不可修改。不可修改性非常重要,这样才能使index对象在多个数据结构之间安全共享。
- index的功能也类似于一个固定大小的集合。
- 每个索引都有一些方法和属性,可用于设置逻辑并回答有关该索引所包含的数据信息的问题。
- index的方法和属性:
- append # 连接另一个index对象,产生一个新的index
- diff # 计算差集,并得到一个index
- intersection # 计算交集
- union # 计算并集
- isin # 计算一个指示各值是否都包含在参数集合中的布尔型数组
- delete # 删除索引i处的元素,并得到一个新的index
- drop # 删除传入的值,并得到新的index
- insert # 将元素插入到索引i处,并得到新的index
- is_monotonic # 当各元素均大于等于前一个元素时,返回True
- is_unique # 当index没有重复值时,返回True
- unique # 计算index中唯一值得数组
三 基本功能
1 重新索引
- pandas对象的一个重要方法是reindex,作用是创建一个适应新索引的新对象。根据新索引进行重排。
obj = Seires([],index = [])
obj = obj.reindex(['','',''])
obj = obj.reindex([],fillna = 0)
- reindex的mathod选项:
- ffill或pad # 前向填充值
- bfill或backfill # 后向填充值
- 对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。
frame = frame.reindex(['','','',''])
frame.reindex(columns = '')
frame.reindex(index = ['','','','',],method = 'ffill',columns = '')
- 利用ix的标签索引功能,重新简洁索引任务。
frame.ix[['','','',''],'']
- reindex函数的参数
- index # 用作索引的新序列,既可以是index实例,也可以是其他数据结构。index会被完全使用,就像没有任何复制。
- method # 插值(填充)方式
- fill_value # 在重新索引的过程中,需要引用缺失值时使用的替代值。
- limit # 前向或后向填充时的最大填充量
- level # 在MultiIndex的指定级别上匹配简单索引,否则选取其子集。
- copy # 默认为True,无论如何复制,如果为False,则新旧相等就不复制。
2 丢弃指定轴上的项
- 丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象。
obj = Series(np.arange(5.),index = ['a','b','c','d','e','f'])
new_obj = obj.drop('c')
- 对于DataFrame,可以删除任意轴上的索引值。
data.drop('one',axis = 0)
data.drop(['one','two'],axis = 1)
3 索引、选取、过滤
- Series索引的工作方式类似于Numpy数组的索引,只不过Series的索引值不只是整数。
obj = Series(np.arange(5.),index = ['a','b','c','d','e','f'])
obj['b':'c']
obj['b':'c'] = 5
- 对DataFrame的索引其实就是获取一个或多个列。
data['one']
data[['one','two']]
data[:2] #行切片索引选取
data[data['three'] > 5] #布尔型数组选取行
data < 5
data[data < 5] = 0
- 为了在DataFrame的行上进行标签索引,引入专门的索引字段ix,可以通过Numpy式的标记法以及轴标签从DataFrame中选取行和列的子集,是一种重新索引的简单手段。
data.ix['',['','']] #先行后列
data.ix[['',''],[1,0,3]] #先行后列
data.ix[[data.three > 5],[:2]]
- 对pandas对象中的数据的选取和重排方式有很多。在使用层次化索引时还能用到一些别的方法。
- DataFrame的索引选项
- obj.ix[:,val] # 选取单个列或列子集
- obj.ix[val1,val2] # 同时选取行和列
- reindex方法 # 将一个或多个轴匹配到新索引
- xs方法 # 根据标签选取单行或单列,并返回一个Series
- icol、irow方法 # 根据整数位置选取单列或当行,并返回一个Seires
- get_value、set_value方法 # 根据行标签和列标签选取单个值。get_value是选取,set_value是设置。
4 算术运算和数据对齐
- pandas最重要的一个功能是,它可以对不同索引对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。
- 自动的数据对齐操作在不重叠的索引处引入NA值,缺失值会在算术运算中广播。
- 对于DataFrame,自动对齐会同时发生在行和列上。
1)在算术方法中填充值
- 在对不同索引的对象进行算术运算时,可能希望在一个对象中某个轴镖旗南在另一个对象中找不到时填充一个特殊值(比如0)。
df1 + df2
df1.add(df2,fill_value = 0)
df1.reindex(columns = df2.columns,fill_value = 0)
- 灵活的算术方法
- add # +
- sub # -
- div # /
- mul # *
2)DataFrame和Series之间的运算
- 默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播。
5 函数应用和映射
- Numpy的ufuncs(元素级数组方法)也可用于操作pandas对象。
- 将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法可以实现此功能。
f = lambda x : x.max() - x.min()
frame.apply(f)
frame.apply(f,axis = 1)
- 元素级的Python函数也可以用。使用applymap函数可以得到frame中各个浮点值的格式化字符串。
format = lambda x : '%.2f' %x
frame.applymap(format)
- Series有一个应用于元素级函数的map方法。
frame['e'].map(format)
6 排序和排名
1)排序
- 按条件对数据集排序(sorting)是一种重要的内置运算。对行或列索引排序,可使用sort_index方法,返回一个已排序的新对象。
frame.sort_index()
frame.sort_idnex(axis = 1) #根据任意轴上的索引就行排序
frame.sort_index(axis = 1,ascending = False) #数据默认是按升序排序的,也可设置降序排序。
- 对于Series,若按值进行排序,可使用其order方法:obj.order()
- 在排序时,任何缺失值默认都会被放到Series的末尾。
- 对于DataFrame,通过将一个或多个列的名字传递给by选项可对一个或多个列进行排序。
frame.sort_index(by = 'a')
frame.sort_index(by = ['a','b'])
2)排名
- 排名(ranking)跟排序关系密切,且它会增设一个排名值(从1开始,一直到数组中有效数据的数量)。与numpy.argsort间接排序索引差不多,只不过可以通过某种规则破坏平级关系。
- rank方法通过“为各组分配一个平均排名”的方式破坏平级关系
- obj.rank() # 直接排名
- obj.rank(method = ‘first’) # 根据值在原数据中出现的顺序给出排名
- obj,rank(ascendiing = False, method = ‘max’) # 降序排名
- 排名时用于破坏平级关系的method选项:
- ‘average’ # 在相等分组中,为各个值分配平均排名
- min # 使用整个分组的最小排名
- max # 使用整个分组的最小排名
- first # 按值在原数据中的出现顺序排名
7 带有重复值的轴索引
- 虽然pandas函数如(reindex)等都要求标签唯一,但这并不强制。
- 索引的is_unique属性可以显示索引对应的值是否唯一。
- 对于重复值得索引,数据选择返回的结果不同。如果索引对应单个值,返回标量值;如果索引对应多个值,返回一个Series。
四 汇总和计算描述统计
- pandas对象拥有一组常用的数学和统计方法。大部分都属于约简和汇总统计,用于从Series中提取单个值(sum or mean)或从DataFrame的行或列中提取一个Series。与对应的Numpy数组方法相比,它们都是基于没有缺失数据的假设构建的。
- 约简方法的选项:
- ① axis # 约简的轴,DataFrame的行用0,列用1
- ② skipna # 排除缺失值,默认值为True
- ③ level # 如果轴是层次化索引的(MultiIndex),则更具level分组简约
- 描述和汇总统计
- count # 非NA值得数量
- describe # 汇总统计描述
- min、max # 最小值和最大值
- argmin、argmax # 最小值和最大值的索引位置
- idximin、idxmax # 最小值和最大值的索引值
- quantile # 样本分位数
- sum # 总和
- mean # 平均数
- median # 算术中位数
- mad # 根据平均值计算平均绝对误差
- var # 方差
- std # 标准差
- skew # 偏度(三阶矩)
- kurt # 峰度(四阶距)
- cumsum # 累计和
- cummin、cummax # 累计最小值和累计最大值
- cumprod # 累计积
- diff # 一阶分差(对时间序列很有用)
- pct_change #百分比变化
1 相关系数与协方差
- 有些汇总统计(如相关系数和协方差) 是通过参数计算出来的。
- Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值得相关系数。cov用于计算协方差。
- DataFrame的corr和cov方法将以DataFrame的形式返回完整的相关系数和协方差矩阵。
- 利用DataFrame的corrwith方法,可以计算列或行与另一个Series或DataFrame之间的相关系数。
2 唯一值、值计数、成员资格
1)唯一值
uniques = obj.unique()
uniques.sort() # 对结果进行排序
2)值计数
- Series是按值频率降序排列的。
- value_counts是一个顶级pandas方法 ,可用于任何数组或序列。
pd.value_counts(obj.values,sort = Flase)
data = df.apply(pd.value_counts).fillna(0)
3)成员资格
- isin,用于判断矢量化集合的成员资格
五 处理缺失数据
- 缺失数据(missing data)在大部分数据分析中都很常见。pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。
- pandas对象上的所有描述统计都排除了缺失数据。
- pandas使用浮点值(Not a Number)表示浮点和非浮点数组中的缺失数据,只是一个便于被检测出来的标记。
- python内置的None也会表当作NaN处理。
- NA处理方法
- dropna # 根据各标签的值是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度。
- fillna # 用指定值或者插值(ffill或bfill)填充缺失数据。
- isnull # 返回一个布尔型对象
- notnull # isnull的否定形式
1 滤除缺失数据
- 对于Series,dropna返回一个仅含非空数据和索引值的Series
data.dropna()
data[data.notnull()]
- DataFrame,稍微复杂一点,dropna默认丢弃任何含有缺失值的行,也可设置丢弃全NA或含有NA的行或列。
data.dropna(how = 'all') #传入how = 'all'将只丢弃全为NA的那些行
data.dropna(axis = 1,how = 'all') #丢弃列
- 另一个滤除DataFrame行的问题设计时间序列处理。若只想留下一部分观测数据,可以用thresh参数。
df.dropna(thresh = 3)
2 填充缺失数据
- fillna方法主要用于填补缺失数据。
- 填充常数值
- 通过一个字典数调用fillna,对不同的列填充不同的值。
- fillna默认返回新对象,但也可以对现有对象进行就地修改。
data = df.fillna(0,inplace = True)
- 对reindex有效的插值方法也可以用于fillna。
df.fillna(method = 'ffill')
df.fillna(method = 'ffill',limit = 2)
- fillna也可以传入Series的平均数或中位数。
data.fillna(data.mean())
- fillna函数参数说明:
- ① value # 用于填充缺失值的标量值或字典对象
- ② method # 插值方式。如果未函数调用时未指定其他参数,默认为’ffill’
- ③ axis # 待填充的轴,默认axis = 0
- ④ inpalce # 修改调用者对象而不产生副本
- ⑤ limit # (对于向前和向后填充)可以连续填充的最大数量
六 层次化索引
- 层次化索引(hierarchical indexing)是pandas的一项重要功能,它使你能够在轴上有用多个(两个以上)索引级别。抽象点说,它使你能以低维度形式处理高维度数据。
data = Series(np.random.randn(10),index = [['a','a','a','b','b','b','b','c','c','c'],[1,2,3,1,2,3,1,2,3]])
- 这就是带有MultiIndex索引的Series的格式化输出形式。索引之间的“间隔”表示“直接使用上面的标签”。
- 对于一个层次化索引的对象,选取数据子集的操作很简单:
data['b'] #直接索引
data['b':'c'] # 切片索引
data[:,2] # 内层中选取
- 层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。比如:unstack方法和其逆运算stack方法:
data.unstack()
data.unstack().stack()
- 对于一个DataFrame,每条轴都可以有分层索引,每层都可以有名字(可以是字符串,也可以是其他Python对象),如果指定了名称,它们就会显示在控制台输出中。(不要将索引名称跟轴标签混为一谈)
frame.index.name = ['key1','key2']
frame.columns.names = ['state,'color']
- 由于有了分部索引,因此可以轻松选取列分组。
1 重排分级顺序
- 有时,需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(数据不会发生变化)。
frame.swaplevel('key1','key2')
- sortlevel则根据单个级别中的值对数据进行排序(稳定的)。交换级别时,常常也会用到sortlevel,这样最终结果就有序了。
frame.sortlevel(1)
frame.swaplevel(0,1).sortlevel(0)
- 在层次化索引的对象上,如果索引是按字典方式从外到内排序,即调用sortlevel(0)或sort_index()的结果,数据选取操作的性能会好很多。
2 根据级别汇总统计
- 许多对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。类似pandas的groupby功能。
3 使用DataFrame的列
- 很多情况下,DataFrame的一个或多个列可以当做索引来用,或者将索引转变为DataFrame的列。
- DataFrame 的set_index函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame。
- 默认情况下,这些被转换为索引的列会被删除,也可以调参保留。
frame2 = frame.set_index(['c','d'])
frame.set_index(['c','d'],drop = Flase)
- reset_index的功能与set_index刚好相反,层次化索引的级别会被转移到列里面。
frame.reset_index()
七 其他有关pandas的话题
1 整数索引
- 基于标签或位置的索引
- 为了保持良好的一致性。如果轴索引含有索引器,那么根据整数进行数据选取的操作将总是面向标签,也包括用ix进行切片。
- 如果需要可靠的、不考虑索引类型的、基于位置的索引,可以用Series的iget_value方法和DataFrame的irow和iloc方法。
serie.iget_value()
frame.irow()
2 面板数据
pandas有一个panel数据结构,可以看做一个三维版的DataFrame,pandas大部分开发工作都集中在表格型数据的操作上,层次化索引页使得多数情况下不需要用到N维数组。
stacked = pdata.ix[:].to_frame() # panel的数据呈现形式
stacked.to_panel()