Python Numpy,Pandas基础笔记
Numpy
Numpy是python的一个库。支持维度数组与矩阵计算并提供大量的数学函数库。
arr = np.array([[1.2,1.3,1.4],[1.5,1.6,1.7]])#创建ndarray时候也可以指定dtype
arr.astype(dtype = np.int) #浮点数转int
#对数组批量运算,作用在每个元素上
arr = np.array([[1,2,3],[4,5,6]])
print arr**5
#索引和切片
arr = np.array([1,2,3,4,5,6])
print arr[:2]#arr[0]和arr[1]
arr = np.array([[1,2,3],[4,5,6]])
print arr[:2] #打印第1,2行 #布尔型索引
name = ['Bob','La','CA','Da','Ea','Fa']
rnd_arr = np.random.randn(7,4)
print rnd_arr[name == 'CA']#利用布尔数组选择行,这里name == 'CA'会产生一个布尔数组
a = [1,2,3]
b = [True,False,True]
print a[b]#选第一个和第三个 #花式索引
a = [1,2,3,4,5]
index = [4,2,0]
b = a[index]
#对于二维数组
arr = np.arange(32).reshape(8,4)
print arr[[1,5,2,7],[:,0,3,1,2]] #1,5,2,7行的0,3,2,1列,如果不加冒号就是打印arr[1][0],arr[5][3] 转置 arr.T
#逻辑表述为数组运算where
x = np.random.randn(1,5)
y = np.random.randn(1,5)
cond = np.array([True,False,True,False,True])
result = np.where(cond,x,y) #也可以省略x,y直接加条件 如 x>2 只有condition的时候返回的是复合条件的坐标索引
#where的逻辑
#如果条件1和2 则0,否则如果条件1取1,否则条件2 取2 ,再不行取3。相当于一个if else的缩写。
#列表推导result = [x if c else y for (c,x,y) in zip(cond,x,y)] #数学和统计方法 sum,mean,std,var这些
arr = np.random.randn(5,4)
bools = np.array([False,False,True,False]) arr.mean(axis = 1) #按行取平均
print (arr>0).sum() #大于0的和
print (bools == True).sum() #True的个数
print bools.any() #有一个True 都True
print bools.all() #有一个为False 则False
unique(x)#去重 ,还有交叉并补 #高斯消元法 qr分解,此外乘法dot,求逆inv
from numpy.linalg import qr
arr = np.random.randn(5,4)
q,r = qr(arr)
print q,r
arr.mean(axis = 0) #按照列求均值,也即是竖直方向,如果axis=1则按行求均值,水平方向 #数组重塑
arr = np.arrange(8)
print arr.reshape(4,2)
#只是改变了显示方式,其实内存中的存储结构不变
#下面三种都能达到同样的效果
x = np.array([[1, 2], [3, 4]])
print x.flatten()
print x.ravel()
print x.reshape(-1)
#两者默认均是行序优先
print x.flatten('F')
print x.ravel('F')
print x.T.reshape(-1)
#flatten ravel的区别
x = np.array([[1, 2], [3, 4]])
x.flatten()[1] = 100
print x
# flatten:返回的是拷贝
x.ravel()[1] = 100
print x
#ravel则是对元素组的一个引用,会改变元素组,和reshape一样只是改变了显示方式 #连接数组
a1 = np.array([[0,1,2],[2,1,3]])
a2 = np.array([[4,5,6],[7,8,9]])
print np.concatenate([a1,a2],axis = 0) #添加行,竖直方向添加,如果axis = 1添加列,水平方向添加
print np.vstack((a1,a2)) #竖直方向叠起来
print np.hstack((a1,a2)) #水平方向叠起来 和上面的效果一样
#拆分
f,s = np.split(a2,[1,2],axis = 0) #竖直方向上,也即是按行拆分
#put,take
arr = np.arange(5)
inds = [1]
arr.put(inds,50) #替换inds位置的数
print arr arr.take([1,2]) #和花式索引效果一样
Pandas
pandas 处理时间序列,缺失数据的处理。
#Series 类似于一维数组,因为平时的数组都是默认索引的,Series可以指定索引。 from pandas import Series
obj = Series([4,7,-5,3],index = ['a','b','c','d'])
print obj[obj > 0] #找出大于0的
print obj.index #字典可以直接生成Series。
locations =['NT','RT','RG','XL']
data = {'NT':4000,'RT':5000,'X':100}
obj = Series(data,index = locations)
print obj #Series,相加相同的索引部分相加,也可以给索引以及该series命名。
#index替换
obj.index = [1,2,3,4] #DataFrame 可以理解成二元的,他是表格型的数据结构,比如我们平常见的Excel。有行索引,列索引,可以理解成Series的合并。
from pandas import Series,DataFrame
data = {
'locations':['NT','RT','RG','XL'],
'years':[2000,2001,2004,2008],
'pop':[1.5,1.6,1.7,1.8]
}
Df = DataFrame(data, columns = ['years','locations','pop'],index = ['one','two','three','four']) #指定列
print Df years locations pop
one 2000 NT 1.5
two 2001 RT 1.6
three 2004 RG 1.7
four 2008 XL 1.8
#修改指定的列,可以设置索引,没有的变成NaN。
val = Series([2, 5, 7],index = ['one','two','four'])
Df['pop'] = val
print Df
years locations pop
one 2000 NT 2.0
two 2001 RT 5.0
three 2004 RG NaN
four 2008 XL 7.0
Df['big'] = (Df.years == 2008) #丢弃指定轴上的项,指定索引或列
print Df.drop(['two','four'],axis = 1)
#索引,选取和过滤
#Series的切片是一个引用
import numpy as np
se = Series(np.arange(4), index = ['a','b','c','d'])
print se['b':'c']
se['b','c'] = 5
print se #DataFrame打印列可以直接调用,打印行需要.ix
data = DataFrame(np.arange(16).reshape(4,4),index = ['a','b','c','d'],columns = ['one','two','three','four'])
print data
#print data.ix['a']
print data.ix[:'c','two'] #'two'列的a,b,c行,对于非数字索引一定是闭区间。
data[data < 5] = 0 #所有小于5的都被设置为0 #算术运算与数字对齐,对齐操作同时发生在行和列上(就是行和列都匹配),索引不对齐的地方计算就是用NA
from pandas import Series
s1 = Series([1,2,3,4,5],index = ['a','b','c','d','e'])
s2 = Series([2,3,4,5,6],index = ['a','b','c','d','f'])
print s1+s2 a 3.0
b 5.0
c 7.0
d 9.0
e NaN
f NaN
dtype: float64
#DataFrame比较复杂,会列出所有的行列,相当于一个并集,然后行列不匹配的那个变成NaN,所有两个DataFrame相加,可能行列大小都会变化,如果不相同的话。
df1 = DataFrame(np.arange(12).reshape(3,4),columns = list('abcd'))
df2 = DataFrame(np.arange(20).reshape(4,5),columns = list('abcde'))
print df1.add(df2,fill_value = 0) #不匹配的,用nan的地方用0填充 a b c d e
0 0.0 2.0 4.0 6.0 4.0
1 9.0 11.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0
#Dataframe和Series之间 相减,默认是按照水平方向,按行,如果axis = 0,则竖直方向,按照列,每一列都减去一个Series。
#函数应用和映射,Series有个应用到元素的map方法,Dataframe有applymap
f = lambda x : x.max() - x.min()
print df1.apply(f, axis = 1)# 对水平方向的每一行最大减最小
print df1.apply(f,axis = 0) # 对竖直方向的每一列最大减最小 #applymap 应用到每一个元素
df1.astype(np.float)
f2 = lambda x: '%.2f' % x
print df1.applymap(f2)
print df1['a'].map(f2)#df['a']相当于一个Series,应用到每一个元素是map #对列和索引进行排序,可以指定升序还是降序还有rank函数
#按照索引排序
df1.sort_index(axis = 1,ascending = False) d c b a
0 3 2 1 0
1 7 6 5 4
2 11 10 9 8 #按值排序
df1.sort_values(by = ['a','b'],ascending = False)#降序,先a按照a,a不行则b
#rank
obj = Series([7,9,-5,1,4,2,2,5])
print obj.rank()#输出的是每个元素应该在的位置 #指定列变成索引
df1.set_index(['a']) #pandas的索引可以用重复,返回的是一个数组
#层次索引
#Series的层次索引
from pandas import Series
s = Series(np.random.randn(5), index = [['a','a','b','b','c'],[1,2,1,2,1]])
print s
print s.index
print s[:2]
print s['b':'c']
print s.unstack() #把1,2放到列上去,c只有1个就变成了NaN了,变成了DataFrame的样子。
print s.unstack().stack() a 1 -1.050402
2 0.489801
b 1 -0.538088
2 0.886044
c 1 2.695847
dtype: float64
MultiIndex(levels=[[u'a', u'b', u'c'], [1, 2]],
labels=[[0, 0, 1, 1, 2], [0, 1, 0, 1, 0]])
a 1 -1.050402
2 0.489801
dtype: float64
b 1 -0.538088
2 0.886044
c 1 2.695847
dtype: float64
1 2
a 0.900427 -0.673935
b 0.162862 -0.118564
c 0.039270 NaN
#DataFrame的层次索引,DataFrame不管在行还是列都可以多值索引
df = DataFrame(np.arange(12).reshape((4,3)),index = [['a','a','b','b'],[1,2,1,2]],columns = [['Ohio','Chicago','NewYork'],['a','b','c']])
print df
#交换两个索引,原来在外面的变到里面,也可以根据索引排序
df.index.names = ['key1','key2']
df_df = df.swaplevel('key1','key2')
df_df.swaplevel(0,1).sortlevel(0)
#指定key统计
print df.sum(level = 'key2')
Ohio Chicago NewYork
red blue green
key2
1 6 8 10
2 12 14 16
#整数索引会有歧义,比如-1,0有时候不知道是位置,还是他的索引,所以避免歧义一般是.iloc
iloc,loc和ix的区别
参考自:http://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation
s = Series(np.arange(8),index = [8,9,15,1,2,3,4,5])
print s 8 0
9 1
15 2
1 3
2 4
3 5
4 6
5 7
dtype: int32 print s.iloc[:3]
8 0
9 1
15 2
dtype: int32 print s.loc[:3]
8 0
9 1
15 2
1 3
2 4
3 5
dtype: int32
print s.ix[:,3]
8 0
9 1
15 2
1 3
2 4
3 5
dtype: int32
#可以看到.ix和.loc是相同的效果,把3当作是index当中的值,而iloc是打印的前三行。如果是s.ix[:7],s.loc[:7]这样的没有的数,就会报错,而.iloc就会打印前7行。
#如果是DataFrame,.ix可以索引,位置混合使用,索引选行,列可以取位置切片。
df = DataFrame(np.arange(12).reshape(3,4),index = list('abc'),columns = ['d','e','f','g'])
print df
print df.ix[:'c',:3] d e f g
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d e f
a 0 1 2
b 4 5 6
c 8 9 10
上面numpy,pandas有很多东西没说,还是要实战才容易记住,多多加油吧!
Python Numpy,Pandas基础笔记的更多相关文章
- Python Numpy shape 基础用法(转自他人的博客,如涉及到侵权,请联系我)
Python Numpy shape 基础用法 shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入 ...
- numpy&pandas基础
numpy基础 import numpy as np 定义array In [156]: np.ones(3) Out[156]: array([1., 1., 1.]) In [157]: np.o ...
- 有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark
有关这个问题,似乎这个在某些时候,用python写好,且spark没有响应的算法支持, 能否能在YARN集群上 运行PySpark方式, 将python分析程序提交上去? Spark Applicat ...
- Python: NumPy, Pandas学习资料
NumPy 学习资料 书籍 NumPy Cookbook_[Idris2012] NumPy Beginner's Guide,3rd_[Idris2015] Python数据分析基础教程:NumPy ...
- Pandas基础笔记
Basic knowledge of Pandas pandas库是以numpy库为基础建成的,是python数据分析的核心库.也正因如此,pandas内的数据结构与numpy的数组有许多相似的地方. ...
- 知了课堂 Python Flask零基础 笔记整理
目录 起步 安装Python2.7: Python虚拟环境介绍与安装: pip安装flask: 认识url: URL详解 web服务器和应用服务器以及web应用框架: Flask 第一个flask程序 ...
- python画图matplotlib基础笔记
numpy~~基础计算库,多维数组处理 scipy~~基于numpy,用于数值计算等等,默认调用intel mkl(高度优化的数学库) pandas~~强大的数据框,基于numpy matplotli ...
- python之pandas学习笔记-初识pandas
初识pandas python最擅长的就是数据处理,而pandas则是python用于数据分析的最常用工具之一,所以学python一定要学pandas库的使用. pandas为python提供了高性能 ...
- numpy+pandas 基础学习
#-*- coding:utf-8 -*- import numpy as np; data1=[1,2,3,4,5] array1=np.array(data1) #创建数组/矩阵 # 使用nump ...
随机推荐
- JHipster框架的简要搭建与说明
JHipster的亮点 风头超劲,席卷欧美,最新全能Java Web开发程式产生器 (java web generator). 由Java专家累积的开发经验,配上各类实用的框架技术,去繁取精的运用,全 ...
- Atitit 游戏的原理与概论attilax总结
Atitit 游戏的原理与概论attilax总结 1. 游戏历史2 1.1.1. 盘点PC游戏史上最重要的50款游戏2 1.1.2. 回味人类文明进程 五款经典的历史游戏2 2. 游戏类型(主要分为6 ...
- iOS之17个提升iOS开发效率的必用工具
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我提升编码速度和工作效率的工具 ...
- Appfuse:记录操作日志
appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...
- C# 在Repeater 的ItemDataBound 如何转换e.Item.DataItem 的类型
1.使用DataSet和DataTable绑定数据源时,用 DataRowView view = (DataRowView)e.Item.DataItem; 2.DataReader绑定数据源时,用 ...
- MVC 后台管理框架 FineUIMvc 在线示例
FineUIMvc 在线示例 基础版下载
- [Erlang 0127] Term sharing in Erlang/OTP 上篇
之前,在 [Erlang 0126] 我们读过的Erlang论文 提到过下面这篇论文: On Preserving Term Sharing in the Erlang Virtual Machine ...
- Python常用方法
Python strip()方法 描述: Python strip()方法用于移除字符串头尾指定的字符(默认为空格). 语法: str.strip([chars]) 参数: chars -- 移除字符 ...
- 解决Native atomics support not found问题
今天用arm-none-linux-gnueabi交叉编译libmysqclient.so,出现Native atomics support not found问题 进入mysql-connector ...
- Apache主配置文件httpd.conf 详解
Apache的主配置文件:/etc/httpd/conf/httpd.conf 默认站点主目录:/var/www/html/ Apache服务器的配置信息全部存储在主配置文件/etc/httpd/co ...