pandas学习笔记(2)


如果利用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里有两个常用的工具数据结构:SeriesDataFrame。尽管他们并不能解决所有问题,但他们为大多数应用提供了一个有效、易用的基础。在这里先简单介绍一下,后续再做深入的剖析。

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

  1. 当字典的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
    
  2. 当字典的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
    
  3. 当列表的元素是字典时,也能创建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


文章作者: Reset Ran
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Reset Ran !
  目录