点击上方“风控圈子”
选择“星标”公众号
每天早上8:30,一起实现自我增值
01pandas及其重要性
- pandas是数据分析工作的首选库。它含有使数据分析工作变得更快更简单的高级数据结构和操作工具。
- pandas是基于Numpy构建的让以Numpy为中心的应用变得更加简单。
- 它能满足工作中的许多需求:
- 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'] #通过赋值的方式修改索引
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各列的数据类型不同,则值数组的数据类型会选用能够兼容所有列的数据类型
索引对象
- 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' %xframe.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 # 按值在原数据中的出现顺序排名
- 虽然pandas函数如(reindex)等都要求标签唯一,但这并不强制。
- 索引的is_unique属性可以显示索引对应的值是否唯一。
对于重复值得索引,数据选择返回的结果不同。如果索引对应单个值,返回标量值;如果索引对应多个值,返回一个Series。
由于文章篇幅限制,今天先分享这些,如果您感兴趣后半部分可以期待下次的分享:
四-汇总和计算描述统计
五-处理缺失数据
六-层次化索引
七-其他有关pandas的话题
全文完,感谢您的耐心阅读
请顺手点个“在看”吧~
▼ 往期精彩回顾 ▼