如果利用python数据分析,基本上都会用到numpy和pandas这两货,前面学了一点numpy,现在慢慢写点pandas的学习笔记
numpy和pandas有啥区别
emmm。。。。以我现在这个初学者的角度来看,numpy处理的对象主要是数字,主要用于矩阵运算,底层是c,运算速度蛮不错;而pandas处理的内容可以是很多种,而且一个DataFrame里边还能有不同类型的元素,但运算方面就没有numpy那么猛了。其实我觉得二者不适合拿来对比,各有各的专长吧😂😂。
安装pandas
安装直接pip install pandas
即可,已安装显示如下:
还是可以用打印版本号的方法检查是否安装成功:
>>> import pandas as pd
>>> pd.__version__
## '0.25.1'
两个常用的类
pandas里有两个常用的工具数据结构:Series
和DataFrame
。尽管他们并不能解决所有问题,但他们为大多数应用提供了一个有效、易用的基础。在这里先简单介绍一下,后续再做深入的剖析。
Series
Series是一种一维的数据对象,它包含了一个值序列(这里的值可以是很多种类型),并且包含了数据标签,称之为索引(index)。其实个人感觉可以参照字典来理解,感觉差不多。
创建一个简单的Series类
>>> obj=pd.Series([4,5,6,7])
>>> obj
0 4
1 5
2 6
3 7
dtype: int64
可以看到出现了两列内容,左边那一列表示的就是index,右边是values,可以看出如果不指定的话,pd.Series()
生成的索引(index)就是从0到N-1(N表示数据的长度)。可以通过调用values属性和index属性分别查看Series对象的内容和索引
>>> obj.values
array([1, 2, 3, 4], dtype=int64)
>>> obj.index
RangeIndex(start=0, stop=4, step=1)
这里的RangeIndex(start=0, stop=4, step=1)
就有点类似于range(0,4,1)
创建一个索引序列
>>> obj2=pd.Series([1,2,3,4],index=['a','b','c','d'])
>>> obj2
a 1
b 2
c 3
d 4
dtype: int64
通过字典来创建一个Series
>>> dic={'Tom':90,'Lily':80,'Mike':66}
>>> obj3=pd.Series(dic)
>>> obj3
Tom 90
Lily 80
Mike 66
dtype: int64
选择数据
选择数据时可以使用标签来进行索引,也可以对选择到的value值进行赋新值
>>> obj2['a']
1
## 也可以索引多个值
>>> obj2[['a','b','d']]
a 1
b 2
d 4
dtype: int64
>>> obj2['a']=5
>>> obj2['a']
5
切片
Series
操作与 ndarray
类似,还支持索引切片,从这点上看,它又类似于一个多维数组
##可以跟ndarray一样切片
>>> obj2[0:2]
a 1
b 2
dtype: int64
##也可以用index的内容来切片
>>> obj2['a':'c']
a 1
b 2
c 3
dtype: int64
可以看出,用index进行切片的话,是默认保留了'c':3
这一组值的,而像Numpy数组一样切片时,是没有保留'c':3
的
跟numpy函数的交互
Series
支持大多数 NumPy 函数,还能将其自身的values
转化成ndarray
或者array
##对valuas进行平方运算
>>> import numpy as np
>>> np.power(obj2,2)
a 1
b 4
c 9
d 16
dtype: int64
##对valuas进行相加运算
>>> obj2+obj2
a 2
b 4
c 6
d 8
dtype: int64
##将values转化成array
>>> obj_np=obj2.to_numpy()
>>> obj_np
array([1, 2, 3, 4], dtype=int64)
总之,Series
支持大多数 NumPy 多维数组的方法。Series
和多维数组的主要区别在于, Series
之间的操作会自动基于标签对齐数据,来看下面这个例子:
##将obj2的后三个数与前三个数进行相加
>>> obj2[1:]+obj2[:-1]
a NaN
b 4.0
c 6.0
d NaN
dtype: float64
看到这里,就更能理解自动基于标签对齐数据这句话了
DataFrame
DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。它是pandas里边使用的最多的数据类型。个人感觉理解的时候就把它想成一个Excel表格就行,表格的第一行就是DataFrame的column,表格的第一列就是DataFrame的index
通过字典创建DataFrame
当字典的value是Series类时,可以利用它创建一个DataFrame
>>> x = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']), 'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} ##直接创建 >>> pd.DataFrame(x) one two a 1.0 1.0 b 2.0 2.0 c 3.0 3.0 d NaN 4.0 ##还可以指定index >>> pd.DataFrame(x,index={'c','b','a'}) one two a 1.0 1.0 c 3.0 3.0 b 2.0 2.0 ##指定index以及column >>> pd.DataFrame(x,index=['d', 'b', 'a'], columns=['one','two', 'three']) one two three d NaN 4.0 NaN b 2.0 2.0 NaN a 1.0 1.0 NaN
当字典的value是列表时,可以利用它创建一个DataFrame,同时也支持指定index和column,方法和前面一样
>>> y={'one': [1., 2., 3., 4.],'two': [4., 3., 2., 1.]} >>> pd.DataFrame(y) one two 0 1.0 4.0 1 2.0 3.0 2 3.0 2.0 3 4.0 1.0
当列表的元素是字典时,也能创建DataFrame
>>> z=[{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}] >>> pd.DataFrame(z) a b c 0 1 2 NaN 1 5 10 20.0
用 Series 创建 DataFrame
>>> w=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
>>> w
a 1
b 2
c 3
d 4
e 5
dtype: int64
>>> pd.DataFrame(w)
0
a 1
b 2
c 3
d 4
e 5
可以发现,当创建DataFrame时如果不指定column,默认的column就是0,1,2,。。。。
简单的选取元素
在DataFrame中选取元素,有一种很直观的想法,就是通过index和column进行索引,但实际操作的时候发现,index是不支持这种操作的,DataFrame只支持用column选取某一列,返回一个Series
>>> m=pd.DataFrame({'one': pd.Series([1., 2., 3.,4], index=['a', 'b', 'c','d']),
'two': pd.Series([5., 6., 7., 8.], index=['a', 'b', 'c', 'd'])})
>>> m
one two
a 1.0 5.0
b 2.0 6.0
c 3.0 7.0
d 4.0 8.0
>>> m['one']
a 1.0
b 2.0
c 3.0
d 4.0
Name: one, dtype: float64
那我如果就想用像取数组元素一样的方式去选取DataFrame的元素,有没有办法呢?其实是有的,前面我们可以提取出每一列,我们直接对返回的Series进行再一次索引操作,就可以选取我们想要的元素了。简短点说,就是先选取列,再选取行
>>> m
one two
a 1.0 5.0
b 2.0 6.0
c 3.0 7.0
d 4.0 8.0
>>> m['one']['a']
1.0
通过专用函数进行索引、选择
DataFrame类有两个方法:.loc
和.iloc
,它们专门用来选取元素,详细用法如下:
描述 | 用法 | 返回 |
---|---|---|
df[col] |
选择列 | Series |
df.loc[label] |
用index选择行 | Series |
df.iloc[loc] |
用整数位置选择行 | Series |
df[5:10] |
行切片 | DataFrame |
举个栗子:
>>> m
one two
a 1.0 5.0
b 2.0 6.0
c 3.0 7.0
d 4.0 8.0
>>> m.loc['a']
one 1.0
two 5.0
Name: a, dtype: float64
>>> m.iloc[1]
one 2.0
two 6.0
Name: b, dtype: float64
>>> m[1:3]
one two
b 2.0 6.0
c 3.0 7.0
查看index与column
>>> m
one two
a 1.0 5.0
b 2.0 6.0
c 3.0 7.0
d 4.0 8.0
>>> m.index
Index(['a', 'b', 'c', 'd'], dtype='object')
>>> m.columns
Index(['one', 'two'], dtype='object')
转置
>>> n=m.T
>>> n
a b c d
one 1.0 2.0 3.0 4.0
two 5.0 6.0 7.0 8.0
>>> n.index
Index(['one', 'two'], dtype='object')
>>> n.columns
Index(['a', 'b', 'c', 'd'], dtype='object')
使用Numpy函数
DataFrame同样支持大部分Numpy通用函数,具体的函数可以去这儿看传送门
一个注意点
pandas中,对于缺失值,都是用NaN
进行表示的,读取Excel的时候如果单元格没有元素,那么就当作缺失值处理,将对应位置赋值为NaN