01 basic of numpy & pandas
after about a week to learn this, I feel it's difficult to remember so many methods in numpy and pandas. the matrix, axis, functions and so on. so I figure out some tips to help me keep a deep memory to my head. like the music <Zombie>, in your head, in your head...... aha~
总结下,numpy适合进行很多数据的运算,就是矩阵之间的折腾,一下子转置,一下子积分等,速度很快,底层用C写的,但是要求数据比较整洁,没有脏数据。
pandas就是多张二维表,有索引index,columns代表各个表,它的重点在与对数据的预处理,对轴上的数据排序,丢弃过滤,计算,类型转化,也有运算,猜测和numpy比起来肯定效率低得多,可以使用很多函数来进行自定义处理数据,感觉适合提取数据,不适合运算。
pandas的基本操作:
Series 一维的 可以看做是一张表 有index和values的属性
obj2 = pd.Series([4,7,-5,3], index=['a','b','c','d']) print(obj2) print(obj2[obj2>0]) # 过滤掉一些数据 print('b' in obj2) # cf: 这种写法只针对索引 index 而不针对values
DataFrame: 可以看做是多张表的集合 有index和columns的属性
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year':[2000, 2001, 2002, 2001, 2002, 2003], 'pop':[1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} frame=pd.DataFrame(data) frame # 在jupyter notebook 上显示甚是好看 如果是frame.head 会取前5个显示
取一行或者取一列的操作靠
frame2.loc['three'] # 取一行 del frame2['eastern'] # 不能用 frame.eastern 这样的 综上所述 还是用传统比较好 # 选择行和列的子集的工具 轴标签loc 整数索引 iloc loc传进去的是字符串 而iloc是整数 难怪有个i 代表int data.loc['California', ['two','three']] # 第一个参数是索引名称 第二个是表名 data.iloc[2,[3,0,1]] # 第一个参数是索引序列 第二个是表的序列 data.loc[['California','Ohio'], ['two','three']]
还可以通过切片来进行操作
data[['two','one']] data[:2] # 这里比较奇怪 不以表名做筛选条件 而是列 其实想想也对 在数据库中 表是没有先后顺序的 # 那么传进去是表名 是整数或者整数数组就是表名 data[data['three']>5] # 通过列进行筛选 得到行 data[data<5]=0
所以需要找到一种最高效,最常用的取值方法,后面看人家代码怎么写的
然后就是一些常规的操作了
data.drop(['one', 'two'], axis='columns') # axis中的 1=columns 那么行呢 0=? data.drop(['California', 'Ohio'],axis='index') # 当然是 0=index 属性名称 对应起来的 df1.add(df2, fill_value=0) # 这样就有了默认值 fill_value=0 但是不知道其他操作都有没有默认值 df1.reindex(columns=df2.columns, fill_value=0) # 在重新索引时也可以指定一个填充值 np.abs(frame) # 还可以这样操作 用numpy操作pandas对象
自定义函数,对数据进行转化和清洗
f = lambda x: x.max() - x.min() frame.apply(f,axis='index') # columns def f(x): return pd.Series([x.min(), x.max()], index=['min', 'max']) # 自己写不出来 但是看得懂系列 需要练习 frame.apply(f) formats = lambda x: '%.2f' % x # 把原本6位小数转化成2位 print(frame) print(frame.applymap(formats))
对数据进行排序
frame.sort_index(axis=0, ascending=True) # 0 代表对列排列 1 代表对行排列 ascending代表是否降序 frame.sort_values(by=['a','b'], ascending=True) # 好玩的排列方式 rank() method='first', 'max'... obj = pd.Series([7,-5,7,4,2,0,4]) obj.rank() # 例如俩个7是6和7位,取平均值 obj.rank(method='first') # 这就是正常的操作 obj.rank(method='max', ascending=True) # 取后面的 往后 frame.rank(axis='columns') # 按照行来操作
很多种组合玩法,在这里我觉得需要了解下pandas的设计思想了,太灵活了,太方便了。
以及一些分析数据前的操作,统计,计数,值的判断
# 带有重复标签的轴索引 obj = pd.Series(range(5), index=['a','a','b','b','c']) print(obj.index.is_unique) # 是否唯一 df.sum(axis=1, skipna=False) # 如果skipna=False 那么遇到NaN都会变成NaN df.idxmax(axis=0) # 默认是以表来排的 df.describe()
还有其他的玩法,但是目前我只要求掌握这么多就够了,能看懂,但是并不能写。
numpy的基本操作:
data = np.random.randn(2, 3) data = data * 10 data = data + data data.shape // 行列 数 data.dtype // 数据类型 data.ndim //行数 arr0=np.zeros((2,4)) arr1=np.ones((2,4)) arrempty=np.empty((2,3)) arr1=np.array([1,2,3], dtype=np.float64) arr2=np.array([1,2,3], dtype=np.int32) arr2d = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) print(arr2d[:2]) print(arr2d[:2, 1:]) arr = np.arange(32).reshape((8,4)) print(arr[[1,5,7,2]][:, [0,3,1,2]]) # 花式索引 arr = np.arange(16).reshape((2, 2, 4)) print(arr.transpose(1,0,2)) # 三个维度 第一个维度和第二个维度转换 第三个不变 arr = np.arange(10) print(np.sqrt(arr)) #开根号 print(np.exp(arr)) # x = np.random.randn(8) y = np.random.randn(8) print(np.maximum(x,y)) # 相加 基础函数 arr = np.random.randn(7) * 5 print(arr) remainder, whole_part = np.modf(arr) print(remainder) # 小数部分 print(whole_part) # 整数部分 arr = np.random.randn(5, 4) print(arr.mean()) print(arr.mean(axis=0)) #计算以列为轴的平均值 print(arr.sum()) print(arr.sum(axis=1)) # 计算以行为轴的总和 samples = np.random.normal(size=(4, 4)) # 一个标准正态分布的4×4样本
关于随机漫步理论在另一篇博客有过了解,后面再结合其他学科深入学习。
jupyter notebook:
pandas : https://github.com/zeroonechange/python/blob/master/data_analysis/pandas_test.ipynb
numpy: https://github.com/zeroonechange/python/blob/master/data_analysis/numpy_test.ipynb