Python数据处理手册

来源:互联网 发布:生命公式软件 编辑:程序博客网 时间:2024/05/17 19:20

Python数据处理手册

关键词: Python


  • Python数据处理手册
  • 1引言
  • 2Numpy基础数组和矢量计算
    • 1 一种多维数组对象ndarray
    • 2 运算函数
    • 3 利用数组进行数据处理
    • 4 数组的文件输入输出
    • 5 线性代数
    • 6 随机数生成
  • pandas
    • 1 Series
    • 2 DataFrame
    • 3 索引对象
    • 4 重新索引
    • 5 丢弃指定轴上的项
    • 6 索引选取和过滤
    • 7 算术运算和数据对齐
    • 8 DataFrame和Series之间的运算
    • 9 函数应用和映射
    • 10 排序和排名
    • 11 带有重复值的轴索引
    • 12 汇总和计算描述统计
    • 13 相关系数与协方差
    • 14 唯一值值计数以及成员资格
    • 15 处理缺失数据

1、引言

numpy和pandas的常用函数及方法。

2、Numpy基础:数组和矢量计算

2.1 一种多维数组对象ndarray

2.2 运算函数

  • 通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。
#数组开方运算函数>>>arr = np.arange(4)>>>arrarray([0, 1, 2, 3])>>>np.sqrt(arr)array([ 0.        ,  1.        ,  1.41421356,  1.73205081])
  • np.modf() #分别显示浮点整数的小数部分和整数部分
>>>np.modf(np.sqrt(arr))(array([ 0.        ,  0.        ,  0.41421356,  0.73205081]), array([ 0.,  1.,  1.,  1.]))
  • 一元ufunc
    np.abs()、np.fabs() #计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs
    np.sqrt() #计算各元素的平方根,相当于arr ** 0.5
    np.square() #计算各元素的平方。相当于arr ** 2
    np.exp() #计算各元素的指数
    np.log()、np.log10()、np.log2()、np.log1p() #分别为自然对数(e)、底数为10、底数为2、log(1+x)
    np.sign() #计算各元素的正负号:1(正数)、0(零)、-1(负数)
    np.ceil() #计算各元素的ceiling值,即大于等于该值的最小整数
    np.floor() #计算各元素的floor值,即小于等于该值的最大整数
    np.rint() #将各元素值四舍五入到最接近的整数,保留dtype
    np.modf() #将数组的小数和整数部分以两个独立数组的形式返回
    np.isnan() #返回一个表示“哪些值是NaN(这不是一个数字)”的布尔数组
    np.isfinite()、np.isinf() #分布返回一个表示“哪些元素是有穷的(非inf,非NaN)”或“哪些元素是无穷的”的布尔型数组
    np.cos()、np.cosh()、np.sin()、np.sinh() #普通型和双曲型三角函数
    np.tan()、np.tanh()、np.arcos()、np.arccosh()、np.arcsin()、np.arcsinh()、np.arctan()、np.arctanh() #反三角函数
    np.logical_not() #计算各元素not x 的真值。相当于-arr

  • 二元ufunc
    np.add(arr1,arr2) #将数组中对应的元素相加
    np.subtract() #从第一个数组中减去第二个数组中的元素
    np.multiply() #数组对应元素相乘
    np.divide()、np.floor_divide() #除法或向下圆整除法(丢弃余数)
    np.power() #对第一个数组中的元素A,根据第二个数组中的相应元素B,计算AB
    np.maximum()、np.fmax() #元素级的最大值计算。fmax将忽略NaN
    np.minimum()、np.fmin() #元素级的最小值计算。fmin将忽略NaN
    np.mod() #元素级的求模运算(除法的余数)
    np.copysign() #将第二个数组中的值的符合复制给第一个数组中的值
    np.greater()、np.greater_equal()、np.less()、np.less_equal()、np.logical_and()、np.logical_or()、np.logical_xor() #执行元素级的比较运算,最终产生布尔型数组,相当于>、>=、<、<=、==、!=

2.3 利用数组进行数据处理

  • np.where() #是三元表达式x if condition else y的矢量化版本。
#当c为True,取x;当c为False,取y>>>x = np.array([1.1,1.2,1.3, 1.4, 1.5])>>>y = np.array([2.1, 2.2, 2.3, 2.4, 2.5])>>>c = np.array([True, False, True, True, False])>>>result = np.where(c, x, y)array([1.1, 2.2, 1.3, 1.4, 2.5])

where通常用于根据另一个数组而产生一个新的数组。
传递给where的数组大小可以不相等,甚至可以是标量值。

  • 数学和统计方法
    获取正态分布的函数:np.random.randn(行数,列数),参数只有一个时,生成的是一维数组。

  • 基本数组统计方法

>>>arr = np.arange(9).reshape((3,3))>>>arrarray([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])

arr.sum() #对数组中全部或某轴向的元素求和。零长度的数组的sum为0
arr.mean() #算术平均数。零长度的数组的mean为NaN
arr.std()、arr.var() #分别为标准差和方差,自由度可调(默认为n)
arr.min()、arr.max() #最大值和最小值
arr.argmin()、arr.argmax() #分别为最大和最小元素的索引
arr.cumsum() #所有元素的累积和
arr.cumprod() #所有元素的累积积

在上面这些方法中,布尔值会被强制转换为1(True)和0(False)

>>>(arr > 0).sum() #正数的数量>>>8

arr.any()、arr.all() #它们对布尔数组非常有用。any用于测试数组中是否存在一个或多个True,而all则检查数组中所有值是否都是True

>>>arr = np.array([False, False, True, False])>>>arr.any()True>>>arr.all()False
  • 排序
    arr.sort() #同Python内置的列表类型一样

  • 唯一化及其他的集合逻辑
    np.unique(数组名) #用于找出数组中的唯一值并返回已排序的结果

>>>names = np.array(['Bob','Joe', 'Will', 'Bob','Joe', 'Will', 'Joe])>>>np.unique(names)array(['Bob','Joe','Will'])#该方法和set有些类似
  • 数组的集合运算
    np.unique(x) #计算x中的唯一元素,并返回有序结果
    np.intersect1d(x,y) #计算x和y中的公共元素,并返回有序结果
    np.union1d(x,y) #计算x和y的并集,并返回有序结果
    np.in1d(x,y) #得到一个表示“x的元素是否包含于y”的布尔型数组
    np.setdiff1d(x,y) #集合的差,即元素在x中且不在y中
    np.setxor1d(x,y) #集合的对称差,即存在于一个数组中,但不同时存在于两个数组中的元素

2.4 数组的文件输入输出

  • Numpy能够读写磁盘上的文本数据、二进制数据。
  • 将数组以二进制格式保存到磁盘。
  • np.save()、np.load()是读写磁盘数组数据的两个主要函数。默认情况下,数组以未压缩的原始二进制格式保存在扩展名为.npy的文件中。
>>>arr = np.arange(10)>>>np.save('an_array', arr)  #将arr保存到磁盘。如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上>>>np.load('an_array.npy')  #读取磁盘数组
  • np.savez() #可以将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可。
>>>np.savez('array.npz', a = arr, b = arr)>>>m = np.load('array.npz')>>>m['a']array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])
  • 存取文本文件
    从文件中加载文本是一个非常标准的任务。python中的文件读写函数格式很容易将新手搞晕,所以主要介绍pandas中的read_csvread_table。有时也需要np.loadtxtnp.genfromtxt将数据加载到普通的NumPy数组中。
>>>arr = np.loadtxt('array.txt', delimiter = ',')#np.savetxt() 执行的是相反的操作:将数组写到以某种分隔符隔开的文本文件中。genfromtxt跟loadtxt差不多,只不过它面向的是结构化数组和缺失数据处理。

2.5 线性代数

NumPy中的矩阵乘法函数:np.dot(x,y)

>>>a = np.random.randn(3,3)>>>b = np.random.randn(3,4)>>>aarray([[ 0.79424789,  2.13225629],       [ 0.56193264,  0.28040479]])>>>barray([[ 2.77264694, -0.76840806, -0.92406786],       [ 0.99918608,  0.33742714,  1.04551225]])>>>np.dot(a,b)array([[ 4.33268977,  0.10917466,  1.49536114],       [ 1.83821738, -0.33717739, -0.22609725]])
  • 常用的numpy.linalg函数
    np.diag(arr) #以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)
    np.dot(x,y) #矩阵乘法
    np.trace() #计算对角线元素的和
    np.linalg.det() #计算矩阵行列式
    np.linalg.eig() #计算方阵的本特征和本特征向量
    np.linalg.inv() #计算方阵的逆
    np.linalg.pinv() #计算方阵的Moore-Penrose伪逆
    np.linalg.qr() #计算QR分解
    np.linalg.svd() #计算奇异值分解
    np.linalg.solve(A,b) #解线性方程组Ax=b,其中A为一个方阵
    np.linalg.lstsq() #计算Ax=b的最小二乘解

2.6 随机数生成

numpy.random模块对python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。

>>>a = np.random.normal((size=(3,3)) #用size=(行数,列数),生成数组,不用size,仅生成一个值,其他函数也是如此>>>aarray([[-0.96685449,  0.08163984, -0.22994784],       [-0.64561687,  0.77092965,  0.69356818],       [ 0.76825463, -1.68469753,  2.07854679]])
  • numpy.random函数
    np.random.seed() #确定随机数生成器的种子
    np.random.permutation() #返回一个序列的随机排列或返回一个随机排列的范围
    np.random.shuffle() #对一个序列就地随机排列
    np.random.rand() #产生均匀分布的样本值
    np.random.randint() #从给定的上下限范围内随机选取整数
    np.random.randn() #产生正态分布(平均值为0,标准差为1)的样本值,类似于Matlab接口
    np.random.binomial() #产生二项分布的样本值
    np.random.normal() #产生正态(高斯)分布的样本值
    np.random.beta() #产生Beta分布的样本值
    np.random.chisquare() #产生卡方分布的样本值
    np.random.gamma() #产生Gamma分布的样本值
    np.random.uniform() #产生在(0,1)中均匀分布的样本值

3 pandas

pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。
引入pandas方式:

from pandas import Series, DataFrameimport pandas as pd

3.1 Series

  • Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。
  • Series:索引在左,值在右边
    仅由一组数据即可产生最简单的Series:
>>>obj = Series([4,7,-5,3])>>>obj0  41  72  -53  3#通过values、index指定属性获取其数组表示形式和索引对象>>>obj.valuesarray([4,7,-5,3])>>>obj.indexInt64Index([0,1,2,3])
>>>obj2 = Series([4,5,6,7],index = ['d','b','a','c'])  #添加索引值, 索引可以通过赋值的方式就地修改obj2.index={}>>>obj2d    4b    5a    6c    7dtype: int64>>>obj2['a']  #索引6>>>obj2[['a','b']]  #索引a  6b  5
  • Series同样可以使用标量乘法、数学运算函数
  • 如果数据别存放在一个python字典中,也可以直接通过这个字典来创建Series。
>>>dict = {'a':2,'b':3,'c':4}>>>obj3 = Series(dict)>>>obj3a  2b  3c  4

如果只传入一个字典,则结果Series中的索引就是原字典的键。

  • pd.isnull()、pd.notnull()可用于检测缺失数据
>>>pd.isnull(obj3) #也可以用obj3.isnull()a  Falseb  Falsec  False>>>pd.notnull(obj3)a  Trueb  Truec  True

3.2 DataFrame

  • DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)
>>>data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}  #字典>>>frame = DataFrame(data)>>>frame   pop   state  year0  1.5    Ohio  20001  1.7    Ohio  20012  3.6    Ohio  20023  2.4  Nevada  20014  2.9  Nevada  2002#结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列#如果指定了列序列,则按指定的列排列(如果传入的列找不到,就会产生NaN值)>>>DataFrame(data, columns = ['year','state','pop']   year   state  pop0  2000    Ohio  1.51  2001    Ohio  1.72  2002    Ohio  3.63  2001  Nevada  2.44  2002  Nevada  2.9#索引(DataFrame添加指定索引的方式同Series相同,参考3.1)>>>frame.year0    20001    20012    20023    20014    2002Name: year, dtype: int64#按行索引frame.ix[索引名或行列]>>>frame.ix[2]pop       3.6state    Ohioyear     2002Name: 2, dtype: object#如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来>>>frame.index.name = 'xuhao';frame.columns.name = 'state'state  pop   state  yearxuhao                   0      1.5    Ohio  20001      1.7    Ohio  20012      3.6    Ohio  20023      2.4  Nevada  20014      2.9  Nevada  2002

列可以通过赋值的方式进行修改。
将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都讲被填上缺失值。

  • DataFrame构造器的数据
    二维ndarray #数据矩阵,还可以传入行标和列标
    由数组、列标或元组组成的字典 #每个序列会变成DataFrame的一列。所有序列的长度必须相同
    NumPy的结构化/记录数组 #类似于“由数组组成的字典”
    由Series组成的字典 #每个Series会成为一列。如果没有显式指定索引,则各Series的索引会被合并成结果的行索引
    由字典组成的字典 #各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样
    字典或Series的列表 #各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标
    由列表或元组组成的列表 #类似于“二维ndarray”
    另一个DataFrame #该DataFrame的索引将会被沿用,除非显式指定了其他索引
    NumPy的MaskedArray #类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NaN缺失值

3.3 索引对象

  • index()
>>>obj = Series(range(3), index = ['a','b','c'])>>>index = obj.indexIndex([u'a', u'b', u'c'], dtype='object')
  • pandas中主要的index对象
    index() #最泛化的index对象,将轴标签标示为一个由Python对象组成的NumPy数组
    int64index() #针对整数的特殊index
    Multiindex() #“层次化”索引对象,标示单个轴上的多层索引。可以看做由元组组成的数组
    datetimeindex() #存储纳秒级时间戳(用NumPy的datetime64类型标示)
    periodindex() #针对period数据(时间间隔)的特殊index

  • index的方法和属性
    append() #连接另一个index对象,产生一个新的index
    diff() #计算差集,并得到一个index
    intersection() #计算交集
    union() #计算并集
    isin() #计算一个指示各值是否都包含在参数集合中的布尔型数组
    delete() #删除索引i处的元素,并得到新的index
    drop() #删除传入的值,并得到新的index
    insert() #将元素插入到索引i处,并得到新的index
    is_moontonic() #当各元素均大于等于前一个元素时,返回True
    is_quique() #当index没有重复值时,返回True
    unique() #计算index中唯一值的数组

3.4 重新索引

>>>obj = Series(range(3), index = ['a','b','c'])>>>obj2 = obj.reindex(['a','b','c','d'])  #调用该Series的reindex将会根据新新索引进行重排,如果某个索引值当前不存在,就引入缺失值>>>obj2a    0.0b    1.0c    2.0d    NaNdtype: float64
>>>obj3 = Series(['blue','purple','yellow'],index=[0,2,4])>>>obj3.reindex(range(6),method = 'ffill')   #对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的。0      blue1      blue2    purple3    purple4    yellow5    yellowdtype: object
  • reindex的(插值)method选项
    ffill或pad #前向填充(或搬运)值
    bfill或backfill #后向填充(或搬运)值
>>>frame = DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'], columns = ['Oo','Tt','Cc'])>>>frame   Oo  Tt  Cca   0   1   2c   3   4   5d   6   7   8>>>frame2 = frame.reindex(['a','b','c','d'])   #对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。如果仅传入一个序列,则会重新索引行    Oo   Tt   Cca  0.0  1.0  2.0b  NaN  NaN  NaNc  3.0  4.0  5.0d  6.0  7.0  8.0#使用columns关键字即可重新索引列>>>states = ['Tt','Uu','Cc']>>>frame.reindex(columns = states)   Tt  Uu  Cca   1 NaN   2c   4 NaN   5d   7 NaN   8#同时对行和列进行重新索引,而插值则只能按行应用(即轴0)>>>frame.reindex(index=['a','b','c','d'],method='ffill',columns=states)   Tt  Uu  Cca   1 NaN   2b   1 NaN   2c   4 NaN   5d   7 NaN   8#利用ix的标签索引功能,重新索引任务可以变得更简洁>>>frame.ix[['a','b','c','d'],states]    Tt  Uu   Cca  1.0 NaN  2.0b  NaN NaN  NaNc  4.0 NaN  5.0d  7.0 NaN  8.0
  • reindex函数的参数
    index 用作索引的新序列。既可以是index序列,也可以是其他序列型的Python数据结构。index会被完全使用,就像没有任何复制一样
    method #插值(填充)方式
    fill_value #在重新索引的过程中,需要引入缺失值时使用的替代值
    limit #前向或后向填充时最大填充量
    level #在Multiindex的指定级别上匹配简单索引,否则选取其子集
    copy #默认为True,无论如何都复制;如果为False,则新旧相等就不复制

3.5 丢弃指定轴上的项

丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象

>>>obj = Series(np.arange(5),index = ['a','b','c','d','e'])>>>obja    0b    1c    2d    3e    4dtype: int32>>>new_obj = obj.drop('c')a    0b    1d    3e    4dtype: int32

3.6 索引、选取和过滤

>>>obj = Series(np.arange(5),index = ['a','b','c','d','e'])>>>obja    0b    1c    2d    3e    4dtype: int32>>>obj['b]1.0>>>obj['a','b']a  0b  1>>>obj[2:4]  #切片c  2d  3>>>obj[obj<2]a  0b  1>>>obj['b':'c']b  1c  2>>>obj < 4  #布尔型索引a     Trueb     Truec     Trued     Truee    Falsedtype: bool#字段ix索引>>>frame   Oo  Tt  Cca   0   1   2c   3   4   5d   6   7   8>>>frame.ix[['a','c'],['Cc','Oo']]   Cc  Ooa   2   0c   5   3>>>frame.ix[['a','c'],[1,2]]   Tt  Cca   1   2c   4   5
  • DataFrame的索引选项
    obj[val] #选取DataFrame的单个或一组列。在一些特殊情况下会比较便利:布尔型数组(过滤行)、切片(行切片)、布尔型DataFrame(根据条件设置值)
    obj.ix[val] #选取DataFrame的单个行或一组行
    obj.ix[:,val] #选取当个列或列子集
    obj.ix[val1,val2] #同时选取行和列
    reindex() #将一个或多个轴匹配到新索引
    xs #根据标签选取单行或单列,并返回一个Series
    icol、irow #根据整数位置选取单列或单行,并返回一个Series
    get_value、set_value #根据行标签和列标签选取单个值

3.7 算术运算和数据对齐

  • 对不同的索引的对象进行算术运算,在相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。
>>>s1 = Series(np.arange(4),index = ['a','c','d','e'])>>>s2 = Series(np.arange(5),index = ['a','c','e','f','g'])>>>s1a    0c    1d    2e    3dtype: int32>>>s2a    0c    1e    2f    3g    4dtype: int32>>>s1 + s2   #自动的数据对齐操作在不重叠的索引处引入了NaN值a    0.0c    2.0d    NaNe    5.0f    NaNg    NaNdtype: float64
  • fill_value #在对不同索引的对象进行算术运算时,数据操作不重叠处填充一个特殊值。
>>>s1.add(s2,fill_value=0)a    0.0c    2.0d    2.0e    5.0f    3.0g    4.0dtype: float64>>>s1.reindex(index = s2.index, fill_value = 0)  #在对Series和DataFrame重新索引时,也可以指定一个填充值a    0c    1e    3f    0g    0dtype: int32
  • 算术方法
    s1.add(s2) #用于加法的方法
    s1.sub(s2) #用于减法的方法
    s1.div(s2) #用于除法的方法
    s1.mul(s2) #用于乘法的方法

3.8 DataFrame和Series之间的运算

#二维数组与某行之差>>>arr = np.arange(12.).reshape(3,4))>>>arrarray([[  0.,   1.,   2.,   3.],       [  4.,   5.,   6.,   7.],       [  8.,   9.,  10.,  11.]])>>>arr[0]array([ 0.,  1.,  2.,  3.])>>>arr  - arr[0]   #这就叫做广播(broadcasting)array([[ 0.,  0.,  0.,  0.],       [ 4.,  4.,  4.,  4.],       [ 8.,  8.,  8.,  8.]])
#DataFrame和Series之间是算术运算将Series索引值默认匹配到DataFrame的列,然后沿着行一直向下广播>>>frame = DataFrame(np.arange(12.).reshape((4,3)),columns = list('bde'), index = ['Uu','Oo','Tt','Or'])>>>series = frame.ix[0]>>>frame     b     d     eUu  0.0   1.0   2.0Oo  3.0   4.0   5.0Tt  6.0   7.0   8.0Or  9.0  10.0  11.0>>>seriesb    0.0d    1.0e    2.0Name: Uu, dtype: float64>>>frame - series  #如果索引找不到,则为NaN      b    d    eUu  0.0  0.0  0.0Oo  3.0  3.0  3.0Tt  6.0  6.0  6.0Or  9.0  9.0  9.0#行在列上广播(即与每列做运算),则需用算术运算方法>>>series2 = frame['d']>>>series2Uu    0.0Oo    3.0Tt    6.0Or    9.0Name: b, dtype: float64>>>frame.sub(series2, axis=0)      b    d    eUu  0.0  1.0  2.0Oo  0.0  1.0  2.0Tt  0.0  1.0  2.0Or  0.0  1.0  2.0

3.9 函数应用和映射

  • NumPy的ufunc(元素级数组方法)也可用于操作pandas对象。
>>>frame = DataFrame(np.arange(12.).reshape((4,3)),columns = list('bde'), index = ['Uu','Oo','Tt','Or'])>>>frame     b     d     eUu  0.0   1.0   2.0Oo  3.0   4.0   5.0Tt  6.0   7.0   8.0Or  9.0  10.0  11.0>>>np.abs(frame) #求绝对值      b     d     eUu  0.0   1.0   2.0Oo  3.0   4.0   5.0Tt  6.0   7.0   8.0Or  9.0  10.0  11.0>>>f = lambda x: x.max() - x.min()>>>frame.appply(f)  #将函数应用到各列所形成的一维数组,apply方法实现b    9.0d    9.0e    9.0dtype: float64>>>frame.apply(f,axis=1) #应用到行Uu    2.0Oo    2.0Tt    2.0Or    2.0dtype: float64

3.10 排序和排名

  • obj.sort_index()方法将返回一个已排序的新对象。
>>>obj = Series(np.arange(5),index = ['e','c','a','d','b'])>>>obje    0c    1a    2d    3b    4dtype: int32>>>obj2 = obj.sort_index()>>>obj2a    2b    4c    1d    3e    0dtype: int32>>>obj2.sort_index(ascending = False) #降序e    0d    3c    1b    4a    2dtype: int32>>>obj2.order()  #按值排序。排序时,任何缺失值默认都会被会放到Series的末尾。e    0c    1a    2d    3b    4dtype: int32
  • 在DataFrame上,将一个或多个列的名字传递给by,即可对相应的列排序
>>>frame = DataFrame(np.arange(12.).reshape((4,3)),columns = list('bde'), index = ['Uu','Oo','Tt','Or'])>>>frame     b     d     eUu  0.0   1.0   2.0Oo  3.0   4.0   5.0Tt  6.0   7.0   8.0Or  9.0  10.0  11.0>>>frame.sort_index(by = 'b',ascending=False)  #按'b'列降序      b     d     eOr  9.0  10.0  11.0Tt  6.0   7.0   8.0Oo  3.0   4.0   5.0Uu  0.0   1.0   2.0
  • 排名
    排名(ranking)跟排序关系密切,它会增设一个排名值(从1开始,一直到数组中有效数据的数量)。它跟numpy.argsort产生的间接排序索引差不多,只不过它可以根据某种规则破坏平级关系。
>>>obj2 = Series([7,-5,7,4,2,0,4])>>>obj2.rank()  #rank()是通过“为各组分配一个平均排名”的方式破坏平级关系的0    6.51    1.02    6.53    4.54    3.05    2.06    4.5dtype: float64>>>obj2.rank(method = 'first')  #在原数据中出现的顺序给出排名0    6.01    1.02    7.03    4.04    3.05    2.06    5.0dtype: float64
  • 排名时用于破坏平级关系的method选项
    method = ‘average’ #默认:在相等分组中,为各个值分配平均排名
    method = ‘min’ #使用整个分组的最小排名
    method = ‘max’ #使用整个分组的最大排名
    method = ‘first’ #按值在原始数据中的出现顺序分配排名

3.11 带有重复值的轴索引

  • 索引值对应多个值
>>>obj = Series(np.arange(5),index = ['a','a','b','b','c'])a    0a    1b    2b    3c    4dtype: int32>>>obj.index.is_unique  #查询索引是否唯一False>>>obj['a']   #如果某个索引对应多个值,则返回一个Series,对应单个的,则返回一个标量值a    0a    1>>>obj['c']4dtype: int32#对DataFrame的行进行索引类似Series

3.12 汇总和计算描述统计

>>>frame = DataFrame([[1,np.nan],[3,-2],[np.nan,np.nan],[5,1]], index = ['a','b','c','d'], columns = ['one','two'])>>>frame   one  twoa  1.0  NaNb  3.0 -2.0c  NaN  NaNd  5.0  1.0>>>frame.sum()one    9.0two   -1.0dtype: float64>>>frame.mean(axis=1,skipna=False)   #axis=1是按列,skipna默认为True,排除缺失值。skipan=False表示不排除缺失值a    NaNb    0.5c    NaNd    3.0dtype: float64
  • 约简方法的选项
    axis #默认=0按行,=1为按列
    skipna #排除缺失值,默认为True
    level #如果轴是层次化索引的(即multilindex),则根据level分组约简
>>>frame.idxmax()  #返回最大值的索引one    dtwo    ddtype: object
  • 描述和汇总统计
    frame.count() #非NA值的数量
    frame.describe() #针对Series或各DataFrame列计算汇总统计
    frame.min()、frame.max() #计算最小值和最大值
    frame.argmin()、frame.argmax() #计算能够获取到最小值和最大值的索引位置(整数)
    frame.idxmin()、frame.idxmax() #计算最大值和最小值的索引值
    frame.quantile() #计算样本的分位数(0到1)
    frame.sum() #值的总和
    frame.mean() #值的平均数
    frame.median() #值的算术中位数(50%)
    frame.mad() #根据平均值计算平均绝对离差
    frame.var() #样本值的方差
    frame.std() #样本值的标准差
    frame.skew() #样本值的偏度(三阶矩)
    frame.kurt() #样本值的峰度(四阶矩)
    frame.cumsum() #样本值的累积和
    frame.cummin()、frame.cummax() #样本值的累积最大值和累积最小值
    frame.cumprod() #样本值的累积积
    frame.diff() #计算一阶差分(对时间序列很有用)
    frame.pct_change() #计算百分数变化

3.13 相关系数与协方差

frame.corr() #相关系数
frame.cov() #协方差矩阵

3.14 唯一值、值计数以及成员资格

>>>obj2 = Series(['c','a','d','a','a','b','b','c','c'])>>>uni = obj2.unique()>>>uniarray(['c', 'a', 'd', 'b'], dtype=object)>>>obj2.value_counts()  #计算各个值出现的频率,默认降序排列c    3a    3b    2d    1dtype: int64
  • 唯一值、值计数、成员资格方法
    obj2.isin() #计算一个表示“Series各值是否包含于传入的值序列中”的布尔型数组
    obj2.unique() #计算Series中的唯一值数组,按发现的书序返回
    obj2.value_counts() #返回一个Series,其索引为唯一值,其值为频率,按计数值降序排列

3.15 处理缺失数据

>>>obj2 = Series(['c','a','d','a','a','b','b','c','c'])>>>obj2.isnull()0    False1    False2    False3    False4    False5    False6    False7    False8    Falsedtype: bool
  • NA处理方法
    obj2.dropna() #根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度(默认丢弃任何含有缺失值的行)
    obj2.fillna() #用指定值或插值方法(如ffill或bfill)填充缺失数据
    obj2.isnull() #返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值NA,该对象的类型与源类型一样
    obj2.notnull() #isnull的否定式

  • 滤除缺失数据

>>>frame = DataFrame([[1,np.nan],[3,-2],[np.nan,np.nan],[5,1]], index = ['a','b','c','d'], columns = ['one','two'])>>>frame   one  twoa  1.0  NaNb  3.0 -2.0c  NaN  NaNd  5.0  1.0>>>frame2 = frame.dropna()  #默认丢弃全部缺失值的行   one  twob  3.0 -2.0d  5.0  1.0>>>frame3 = frame.dropna(how = 'all')   #丢弃全为NA的行,参数添加axis=1可按列丢弃   one  twoa  1.0  NaNb  3.0 -2.0d  5.0  1.0
  • 填充缺失数据
>>>frame = DataFrame([[1,np.nan],[3,-2],[np.nan,np.nan],[5,1]], index = ['a','b','c','d'], columns = ['one','two'])>>>frame   one  twoa  1.0  NaNb  3.0 -2.0c  NaN  NaNd  5.0  1.0>>>frame.fillna(0)   one  twoa  1.0  0.0b  3.0 -2.0c  0.0  0.0d  5.0  1.0

参考文献《Python数据分析》

1 0
原创粉丝点击