《利用python进行数据分析》的第4、5章介绍了两个非常重要的包,NumPy和Pandas,这篇文章是我看这两章做的笔记,只列了要点和我觉得要留意的地方。
电子书和配套代码,还有一些学习资源,猴子在这里都提供拉:猴子:如何学习《利用python进行数据分析》这本书?zhuanlan.zhihu.com
(我看的是英文新版,针对Python3,信我,英语过四级的绝对能看懂,别怕!)
Ch4. NumPy
NumPy包中最重要的对象是多维数组(ndarray),数组里的数据叫元胞(cell)。
ndarray(简称array)
数组内元胞必须是同种数据类型,shape-查看行列,.dtype-查看元胞类型,.ndim-查看维度。修改元胞类型可用.astype(np.float64),这个方法可以把string类型的数值转换成纯数值。
构造方法
(不加dtype参数的话默认创建float64类型)list转array,np.array,指定元素类型:arr = np.array([1,1,2], dtype = np.int32),注:元素等长的list转换成array会变成多维
np.zeros(shape),单个数字就是一维的,两个是二维(行,列)
np.empty((length,shape)),例np.empty((2,2,3)),只分配地址,不赋初值
np.full((shape),fill_value)
np.arange(5),结果是array([0,1,2,3,4])
arr2 = np.ones_like(arr1) 或zeros_like(arr1),
np.random.normal(size=(4,4)),标准正态分布array最重要的特征是“向量化”,等长的array间能进行数学运算。
array的切片和list不同,array的切片不是copy,而是映射view,提取切片修改它的数值原始的array也会被修改!要想复制可用arr[5:8].copy()。切片里可以直接用判断语句,如data[data < 0]
一个神奇的功能:可以用boolean判断得到的True作为数组的下标,但boolean数组必须与目标数组等长,返回的是copy,例子:
4. “fancy index” :arr[[1, 5, 7, 2], [0, 3, 1, 2]],这里选择的是(1,0),(5,3),(7,1),(2,2)
5. array.T,最正常的转置。transpose和swapaxes用shape去理解,<详细例子理解> 如:transpose(2,1,0) = shape[0,1,3]—>[3,1,0] , swapaxes(2,1) = shape[0,1,3]—>[0,3,1]
array里一些好用的函数np.where(条件con,替代值x,替代值y),相当于语句x if con else y. 例如np.where(arr>0, 2, arr),数组arr中大于0的元胞变成2,其他不变。
求统计值系列:.mean/sum/cumsum(累加)/cumprod(累乘)/min/max/std/var(方差)…...可带参数axis指定计算方向,0列1行。(这样能实现统计学上的降维,估计是为了建模时拟合度更好。)
排序sort(1),参数0列1行
集合属性系列:仅对一维数组有效
Ch5. Pandas
Series
Series就是带索引(index)的一维array,开头的S必须大写。
构造方法obj = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])。不带参数的话默认使用数字索引0、1、2….(这里,为了避免数字索引和行数混淆,如果索引是int,在切片时默认[]内是索引而不是行数)
.Series(dict) 传入字典,key自动作为索引
关于索引注意,用[索引]切片时左右都是闭区间,如obj['b':'c']是b和c行,用行数切片时是左闭右开,如obj[1:3]是1、2行
可以通过索引访问、修改元素,多个索引这样表示:s[['a','c']]
可以直接新增元素,obj['d'] = 6
s.index查看索引和类型(索引不是非要int)对Series使用函数,作用的是Series的copy,要赋值后才会改变Series本尊,比如s.reindex(['b','a','d','c'])修改下标,s本身不会变,要s=s.reindex(['b','a','d','c'])才行。
常用isnull, notnull查缺失值,.sort_index默认按行升序
关于axis的特别提醒
看了一些例子后搞不清楚axis=1到底是按行还是按列。。其实正确来记axis应该被当做动词理解,就是axis=0代表往跨行(down),而axis=1代表跨列(across),
换句话说:使用0值表示沿着每一列或行标签\索引值向下执行方法
使用1值表示沿着每一行或者列标签方向执行对应的方法
DataFrame
理解成“表”,每一列的数据可以是不同类型,每一列是一个Series。列索引叫column,行索引叫index,它们还能有更具体的名字表达实际含义,(看起来更像一张表了)例子:
构造方法np.DataFrame(),传入等长字典(嵌套字典也行)、list或者array,可指定参数column与index
读取文件,比如.read_csv(),.read_Excel()
增删改查由列索引读取某列数据:df.name或df['name']。'name'列不存在的话直接df['name']=[…]就会创建,但df.name不行。
由行、列索引读取:df.loc['a':'c',’age‘],a\c是行索引,age列索引
由行数、列数读取:如df.iloc[1]是第二行,df.iloc[2,[0,1]]是第三行的一、二列
df[(df.class =='second') & (df.age < 20)],[]里写查询条件,或者用query函数里写SQL语句:df.query('(age < 20) and (class=="second")')
联合起来用,df.iloc[ :,:3 ][ df.age>5 ],在指定区域查找
粗暴地删除某列用 del df['age']或 df.drop('age',axis=1),删除某行 df.drop(行索引)。如果想只删除age列为14,15,16的某几行可以这样写:df=df[(True-df['age'].isin([14,15,16]))] ,参考自<这里>
修改某列Series的类型,df.age = df.age.astype('str') (牢记上面提到的函数对Series的copy起作用)。
一些函数
排序 .sort_value(by=[索引])
.rename(index= ,columns= ),实际上当做“复制df”来用而不是中文字面的重命名。会创建copy而不是更改本尊,如果想直接改本尊请带上inplace=True参数。还可以在参数中更改特定的index,如
data.rename(index={'OHIO': 'INDIANA'},
columns={'three': 'peekaboo'})
在实际练习中遇到疑难会再补充