数据分析之pandas(一)

    技术2024-03-13  84

    数据分析之pandas(一)

    简介

    pandas 是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    数据结构

    Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。

    Time- Series:以时间为索引的Series。

    DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。

    Panel :三维的数组,可以理解为DataFrame的容器。

    Panel4D:是像Panel一样的4维数据容器。

    PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

    一、series

    序列(Series)是由一组数据(各种NumPy数据类型),以及一组与之相关的数据标签(索引)组成,序列不要求数据类型是相同的。

    序列是一个一维数组,只有一个维度(或称作轴)是行(row),在访问序列时,只需要设置一个索引。pandas自动为序列创建了一个从0开始到N-1的序号,称作行的下标,行的位置。可以显式设置index参数,为每行设置标签,pandas把标签称作索引。用户可以通过索引、也可以通过位置来访问Series对象中的元素。

    序列可以看作是索引到数据值的一个映射,一个索引对应一个数据值,这种结构就是有序的字典。

    简而言之,序列就是一组带有标签的一维数组,标签可以看成索引。

    1、创建序列的三种方法

    序列的构造函数定义是:

    pandas.Series(data=None, index=None, dtype=None, name=None, copy=False)

    构造函数的参数:

    data:传递给序列的数据,可以是ndarray、list或字典index:设置轴的索引,索引值的个数与data参数的长度相同。如果没有设置index参数,那么默认值是 np.arange(n),或者 RangeIndex (0, 1, 2, …, n)。dtype:设置序列元素的数据类型,如果没有设置,那么将推断数据类型name:序列是一个多行的结构,name是序列的名称copy:复制数据,默认值是false

    索引的下标是自动生成的,从0开始,加1递增。对于序列的data,可以通过序列的属性values来访问;对于序列的索引,可以通过序列的属性index来访问。

    1.1、使用一维数组创建序列

    import numpy as np import pandas as pd import string s1 = pd.Series(np.arange(7)) print(s1) 0 0 1 1 2 2 3 3 4 4 5 5 6 6 dtype: int32

    显式传递index参数

    注意:在构造函数中传递自定义的索引列表,索引的长度必须和data的长度相同,如下所示:

    sd1 = pd.Series(data = np.arange(5),index = list(string.ascii_uppercase[:5])) print(sd1) A 0 B 1 C 2 D 3 E 4 dtype: int32

    显式设置序列的name和index的name

    注意:序列是一维数组,只有一个维度,那就是row,在序列中为Index命名就是设置行轴的名称。

    sd2 = pd.Series(data=['a','b'],index=pd.Index(['01','02'],name='index_name'),name='series_name') print(sd2) index_name 01 a 02 b Name: series_name, dtype: object

    1.2、使用列表创建序列

    s2 = pd.Series([1, 2, 3, 4]) print(s2) 0 1 1 2 2 3 3 4 dtype: int64

    1.3、使用字典创建序列

    使用一个字典生成Series,其中字典的键,就是索引

    s3 = pd.Series({'1':'A', '2':'B', '3':'C'}) print(s3) 1 A 2 B 3 C dtype: object

    2、序列的属性

    序列对象包含的属性:

    index:序列的索引shape:序列的形状,表示各个维度的数量values:把序列的数据值转换为numpy数组dtype:序列元素的数据类型hasnan:序列是否包含nanis_unique:序列的元素是否是唯一的

    2.1、序列的索引(index)

    s_index = pd.Series({'1':'A', '2':'B', '3':'C'}) print("s_index索引:", s_index.index) print("s_index.index数据类型:",type(s_index.index)) s_index索引: Index(['1', '2', '3'], dtype='object') s_index.index数据类型: <class 'pandas.core.indexes.base.Index'>

    2.2、 序列的形状(shape)

    sp = pd.Series({'1':'A', '2':'B', '3':'C'}) print("sp的shape:", sp.shape) sp的shape: (3,)

    2.3、 序列的值(values)

    sv = pd.Series({'1':'A', '2':'B', '3':'C'}) print(sv.values) print(type(sv.values)) ['A' 'B' 'C'] <class 'numpy.ndarray'>

    3、序列数据的转换

    3.1、转换序列的数值类型

    Series.astype(dtype, copy=True, errors='raise', **kwargs)

    语法参数

    dtype:转换的数据类型

    copy:copy=True返回副本,default True

    errors:errors=‘ignore’忽略异常,默认’raise’,异常报错

    s = pd.Series(range(3)) print(s) s = s.astype('float') print(s) 0 0 1 1 2 2 dtype: int64 0 0.0 1 1.0 2 2.0 dtype: float64

    3.2、把序列转换为list

    Series.tolist() s = pd.Series(range(3)) s = s.tolist() print(s)#[0, 1, 2]

    3、访问序列的元素

    序列元素的访问,可以通过索引和行标签,索引标签是在构造函数中通过index参数传递或构造的,而索引值(也可以称作序列的下标)是默认生成的,第一个元素的下标值是0,依次加1递增。

    3.1、通过索引访问series的元素

    s = pd.Series(data = range(5),index = list(string.ascii_uppercase[:5])) print(s) print("索引为C的元素:",s['C']) A 0 B 1 C 2 D 3 E 4 dtype: int64 索引为C的元素:2

    3.2、series切片

    s = pd.Series(data = range(10), index = list(string.ascii_uppercase[:10])) s = s[2:10:3]#[start:end:step] print(s) #C 2 #F 5 #I 8 #dtype: int64 s = pd.Series(data = range(10), index = list(string.ascii_uppercase[:10])) s = s[["A","C","E"]]#传入索引列表获取多个元素 print(s) #A 0 #C 2 #E 4 #dtype: int64 s = pd.Series(data = range(10), index = list(string.ascii_uppercase[:10])) s = s[["A","C","E","Z"]] print(s) #A 0.0 #C 2.0 #E 4.0 #Z NaN #dtype: float64

    3.3、通过位置掩码(布尔索引数组)来访问序列的元素

    索引数据的元素类型是布尔类型,并且索引数组的元素数量和序列相同,那么把这种索引数组称作bool索引,也称位置掩码。当位置为True时,表示选择该元素;当位置为False,表示不选择该元素。

    #布尔索引来访问序列的元素 s = pd.Series(data = range(10), index = list(string.ascii_uppercase[:10])) s1 = s[[True,False,False,False,True,True,True,True,False,True]]#bool索引 s2 = s[s>3]#bool索引 print(s1) print("*"*50) print(s2) #A 0 #E 4 #F 5 #G 6 #H 7 #J 9 #dtype: int64 ************************************************** #E 4 #F 5 #G 6 #H 7 #I 8 #J 9 #dtype: int64

    3.4、获得懒惰迭代器来访问元素

    可以通过序列的_ iter _()函数获得值的迭代器,也可以通过items()或iteritems()函数获得包含索引和值的元组的迭代器:

    Series. __iter__(self) #Return an iterator of the values. Series.items(self) #Lazily iterate over (index, value) tuples. Series.iteritems(self) #Lazily iterate over (index, value) tuples. s = pd.Series(data = range(10), index = list(string.ascii_uppercase[:10])) for i in s.items(): print(i) #结果如下: ('A', 0) ('B', 1) ('C', 2) ('D', 3) ('E', 4) ('F', 5) ('G', 6) ('H', 7) ('I', 8) ('J', 9)

    4、序列的基本常用方法

    4.1、删除元素的元素

    根据行标签删除特定的元素

    Series.drop(self, labels=None)

    4.2、对序列元素执行条件查询

    如果序列元素的值满足cond条件,返回other的值;如果不满足,返回元素的值。

    Series.where(self, cond, other=nan, inplace=False)

    4.3、把序列追加到一个序列末尾

    把to_append序列追加到序列的末尾,设置ignore_index表示忽略原始序列的索引,重新创建一个索引:

    Series.append(self, to_append, ignore_index=False, verify_integrity=False)
    Processed: 0.017, SQL: 9