- numpy和panda快速入门
- numpy快速入门
- **NumPy**的**ndarray**:一种多维数组对象
- 创建ndarray
- **Ndarray**的数据类型
- 数组的运算
- 基本的索引和切片
- 切片索引
- 常用函数
- 一般函数
- 数据分析函数
- 线性代数函数
- 伪随机模块
- Pandas入门
- **Series**
- **Dataframe**
- 基本功能
- 丢弃指定轴上的项
- 切片
- 填充值
- 函数映射
- 排序和排名
- 统计
NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。
import numpy as np data=np.random.randn(2,3) print(data) data_1=data*10 print(data+data_1) >>[[-0.457506 -1.26156644 -1.31556634] [-1.32068304 -0.56163949 -0.33118139]] >>[[ -5.032566 -13.87723084 -14.47122979] [-14.52751346 -6.1780344 -3.64299524]]
ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)
print(data.shape) print(data.dtype) >>(2, 3) >>float64
-
numpu.random.rand():rand函数根据给定维度生成[0,1)之间的数据包含0,不包含
-
numpy.random.randn():randn函数返回一个或者一组样本,具有正态分布
-
numpu.random.randint(low, high=None, size=None, dtype=’l’): 返回随机整数,具体的范围为[low,high)
-
numpy.random.seed():
-
np.random.seed()的作用:使得随机数据可预测。
-
当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数.
np.random.seed(0) np.random.rand(5) >>array([ 0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
np.random.seed(1676) np.random.rand(5) >>array([ 0.39983389, 0.29426895, 0.89541728, 0.71807369, 0.3531823 ]) np.random.seed(1676) np.random.rand(5) >>array([ 0.39983389, 0.29426895, 0.89541728, 0.71807369, 0.3531823 ])
-
创建数组最简单的办法就是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。
data_2=[6,7.5,9,4,23] arr1=np.array(data_2)#将序列变为数组 >>[ 6. 7.5 9. 4. 23. ] data_3=[[1,2,3,4],[5,6,7,8]]#将嵌套序列转变为数组 >>[[1 2 3 4] [5 6 7 8]]
除np.array之外,还有一些函数也可以新建数组。比如,zeros和ones分别可以创建指定长度或形状的全0或全1数组。empty可以创建一个没有任何具体值的数组。要用这些方法创建多维数组,只需传入一个表示形状的元组即可:
a=np.zeros(10)#因为不只有一个0,所以要zeros 此处为创建一个一阶矩阵 b=np.zeros((3,6))#创建三行六列的0矩阵 c=np.zeros((2,3,6))#创建两个三行六列的0矩阵 上述np.ones()同理 '''注意:认为np.empty会返回全0数组的想法是不安全的。很多情况下(如前所 示),它返回的都是一些未初始化的垃圾值。''' d=np.empty((2,3)) >>[[-1.73250426e-100 1.41808450e-311 1.41808450e-311] [-1.78734578e-218 1.41808450e-311 1.41808450e-311]
arange是Python内置函数range的数组版:
a=np.arange(15) >>[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]Ndarray的数据类型
### 可以通过ndarray的astype方法明确地将一个数组从一个dtype转换成另一个dtype: arr=np.array([1,2,3,4,5]) #int float_arr=arr.astype(np.float64) print(float_arr.dtype) >>float64 arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])#浮点转整数会直接舍弃小数部分 print(arr.astype(np.int32)) >>[ 3 -1 -2 0 12 10] numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_) print(numeric_strings.astype(float))#直接将数字字符串转换为数值 >>[ 1.25 -9.6 42. ]数组的运算
数组的运算比较简单,简单的加减乘除即可,这里说明两个数组进行比较时:不同大小的数组之间的运算叫做广播(broadcasting)
arr=np.array([[1,2,3],[1,2,3]]) arr2=np.array([[0., 4., 1.], [7.,2., 12.]]) print(arr>arr2) >>[[ True False True] [False False False]]
关于广播:Numpy的Universal functions 中要求输入的数组shape是一致的,当数组的shape不想等的时候,则会使用广播机制,调整数组使得shape一样,满足规则,则可以运算,否则就出错 。
- 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
- 输出数组的shape是输入数组shape的各个轴上的最大值
- 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
- 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值
两个array的shape长度与shape的每个对应值都相等的时候,那么结果就是对应元素逐元素运算,运算的结果shape不变。shape长度不相等时,先把短的shape前面一直补1,直到与长的shape长度相等时,此时,两个array的shape对应位置上的值 :1、相等 或 2、其中一个为1,这样才能进行广播。
基本的索引和切片在一维数组中,索引位置上的元素是标量,对于变量的任何修改都会作用到原数据
arr=np.arange(10) print(arr[1:5])#输出[1 2 3 4] arr_slice=arr[5:8] arr_slice[1]=12345 print(arr) >>[0,1,2,3,4,5,12345,7,8,9]
在二维数组中各个索引位置上的元素不再是标量而是返回一维数组
arr2d=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr2d) print(arr2d[2]) >>[[1 2 3] [4 5 6] [7 8 9]] >>[7 8 9]
当对各个元素进行访问时,你可以传入一个以逗号隔开的索引列表来选取单个元素
arr2d[0][2] arr2d[0,2]#而这等价
当我们对矩阵的元素进行修改的时候,只需要将新的值赋予索引值即可:
arr3d = np.array([[1,2,3], [4,5,6],[7,8,9],[10,11,12]]) >>[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] arr3d[0]=[1,3,5]#将第0行赋值为[1,3,5] >>[[ 1 3 5] [ 4 5 6] [ 7 8 9] [10 11 12]]切片索引
ndarray的切片语法跟Python列表对象切片差不多
可以一次传入多个切片,类似于传入多个索引:
arr2d=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) arr2d[:2,1:] >>[[2 3] [5 6]]常用函数 一般函数 数据分析函数 线性代数函数 伪随机模块 Pandas入门 Series
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series:
obj=pd.Series([4,7,5,3])##自动返回标签 print(obj) >> 0 4 1 7 2 5 3 3
Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。你可以通过Series的values和index属性获取其数组表示形式和索引对象:
In [13]: obj.values Out[13]: array([ 4, 7, -5, 3]) In [14]: obj.index # like range(4) Out[14]: RangeIndex(start=0, stop=4, step=1)
同时我们也可以自己创建索引值:
In [15]: obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [16]: obj2
Out[16]:
d 4
b 7
a -5
c 3
#当然我们也可以通过索引的方式选取Series的单个或者一组值
In [18]: obj2['a']
Out[18]: -5
In [19]: obj2['d'] = 6
In [20]: obj2[['c', 'a','d']]
Out[20]:
c 3
a -5
d 6
#我们也可以对其使用np的运算
In [21]: obj2[obj2 > 0]
Out[21]:
d 6
b 7
c 3
In [22]: obj2 * 2
Out[22]:
d 12
b 14
a -10
c 6
In [23]: np.exp(obj2)
Out[23]:
d 403.428793
b 1096.633158
a 0.006738
c 20.085537
#还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映
#射。它可以用在许多原本需要字典参数的函数中:
In [24]: 'b' in obj2
Out[24]: True
In [25]: 'e' in obj2
Out[25]: False
#如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series:
In [26]: sdata = {'Ohio':35000, 'Texas': 71000, 'Oregon':16000,'Utah': 5000}
In [27]: obj3 = pd.Series(sdata)
In [28]: obj3
Out[28]:
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
#当然我们也可以传入另一个标签对某个字典的值进行寻找
In [29]: states = ['California', 'Ohio', 'Oregon', 'Texas']
In [30]: obj4 = pd.Series(sdata,index=states)
In [31]: obj4
Out[31]:
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
#当数据确实时,返回NaN
#同样我们可以用来检查缺失值
In [32]: pd.isnull(obj4)
Out[32]:
California True
Ohio False
Oregon False
Texas False
In [33]: pd.notnull(obj4)
Out[33]:
California False
Ohio True
Oregon True
Texas True
In [34]: obj4.isnull()
Out[34]:
California True
Ohio False
Oregon False
Texas False
Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:
In [38]: obj4.name = 'population'#设置文件名字 In [39]: obj4.index.name = 'state' #设置标签名字 In [40]: obj4 Out[40]: state California NaN Ohio 35000.0 Oregon 16000.0 Texas 71000.0 Name: population, dtype: float64Dataframe
Dataframe是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。Dataframe既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。Dataframe中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。
建Dataframe的办法有很多,最常用的一种是直接传入一个由等长列表或NumPy数组组成的字典:
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)#建立表格
print(frame)
》》
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
如果指定了排列顺序则会按照排列顺序输出:
frame=pd.DataFrane(data,columns=['year', 'state', 'pop'])
>>
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
5 2003 Nevada 3.2
和numpy一样我们也可以只选取其中某一行或者某一列:
print(frame['state']) print(frame.state)#都可以 print(frame.loc[1,1])#基于xy标签索引 print(frame.iloc[1,1])#基于索引值索引 >> 0 Ohio 1 Ohio 2 Ohio 3 Nevada 4 Nevada 5 Nevada
修改表格中的数值等:
frame['year'] = 16.5
则整列都会被修改为16.5
frame2['eastern'] = frame2.state == 'Ohio'#添加新的列
del frame2['eastern']#删除列
frame3.T#对frame3进行转置
当然values属性也可以返回二维ndarray形式:
frame3.values
>>
array([[ nan, 1.5],
[ 2.4, 1.7],
[ 2.9, 3.6]])
Index对象是不可变的,因此用户不能对其进行修改:
与python的集合不同,pandas的Index可以包含重复的标签
基本功能pandas对象的一个重要方法是reindex,其作用是创建一个新对象,它的数据符合新的索引。
obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c']) obj1=obj.reindex(['a', 'b', 'c', 'd', 'e'])#重新排序
对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的,例如,使用ffill可以实现前向值填充:
obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0 , 2, 4]) obj3.reindex(range(6), method='ffill')#自动填充缺失值丢弃指定轴上的项
obj=pd.Series(np.arange(5.),index=['a','b','c','d','e'])
print(obj.drop('c'))
>>
a 0.0
b 1.0
d 3.0
e 4.0
#通过传递axis=1或axis='columns'可以删除列的值:
切片
利用标签的切片运算与普通的Python切片运算不同,其末端是包含的:
In [125]: obj['b':'c'] Out[125]: b 1.0 c 2.0 dtype: float64
用切片可以对Series的相应部分进行设置:
In [126]: obj['b':'c'] = 5 In [127]: obj Out[127]: a 0.0 b 5.0 c 5.0 d 3.0 dtype: float64填充值
df1.add(df2, fill_value=0)#df1+df2 中间的缺失值的填充为0函数映射
将函数应用到由各列或行所形成的一维数组上。Dataframe的apply方法即可实现此功能:
In [193]: f = lambda x: x.max() - x.min() In [194]: frame.apply(f)#对frame变量应用(apply)f函数 Out[194]: b 1.802165 d 1.684034 e 2.689627 dtype: float64
这里的函数f,计算了一个Series的最大值和最小值的差,在frame的每列都执行了一次。结果是一个Series,使用frame的列作为索引。如果传递axis='columns’到apply,这个函数会在每行执行。
排序和排名根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用sort_index方法,它将返回一个已排序的新对象:
d 0
a 1
b 2
c 3
print( obj.sort_index())
a 1
b 2
c 3
d 0
frame=
a b c d
three 1 2 3 0
one 5 6 7 4
frame.sort_index(axis=1, ascending=False)#默认时升序 此时为 对第行标签进行降序排序
d c b a
three 0 3 2 1
one 4 7 6 5
还可以对值进行排序:
若要按值对Series进行排序,可使用其sort_values方法:
obj = pd.Dataframe(np.arange(12).reshape((4,3)),index=['a','b','c','d'],columns=['one','two','three']) >> one two three a 0 1 2 b 3 4 5 c 6 7 8 d 9 10 11 print(obj.sort_values(by='one'))#对“one”进行值排序,也可多列排序传入多个值统计



