zoukankan      html  css  js  c++  java
  • pandas 学习 第2篇:Series -(创建,属性,转换和索引)

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

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

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

    一,创建序列

    序列的构造函数定义是:

    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,使用ndarray或list创建序列

    使用ndarray的一维数组,或者list来构造序列,序列包含两部分:索引和序列值,如下所示

    >>> data=np.array(['a','b']) # data=['a','b']
    >>> sd=pd.Series(data)
    0    a
    1    b
    dtype: object

    分析序列的输出:

    最左侧的0和1是行索引,a和b是数据值。

    在构造序列时,如果没有传递index参数,默认情况下,pandas分配了从 0 到  len(data)-1  的索引。

    显式传递index参数

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

    >>> sd=pd.Series(data,index=[101,102])
    101    a
    102    b
    dtype: object

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

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

    >>> sd=pd.Series(data=['a','b'],index=pd.Index([101,102],name='idx_name'),name='series_name')
    idx_name
    101    a
    102    b
    Name: series_name, dtype: object

    序列看起来像多行一列的数据集,但是他们之间有本质的区别,多行一列是二维数组,有行名称和列名称,需要使用两个索引值来访问单个cell的数据,而序列只需要一个索引就可以访问元素值。

    3,从字典构造序列

    通过字典来创建Series,字典的key作为序列的索引标签,value作为对应Key的数据值:

    >>> sdata = {'b': 12, 'a': 13}
    >>> spd.Series(sdata)
    b    12
    a    13
    dtype: int64

    通过字典构建的序列,索引是标签(字符类型)。

    二,序列的属性

    序列对象包含的属性:

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

    1,序列的索引

    >>> sd.index
    Int64Index([101, 102], dtype='int64', name='idx_name')

    2,序列的shape

    >>> sd.shape
    (2,)

    3,序列的PandasArray或ndarray数组

    >>> sd.array
    <PandasArray>
    ['a', 'b']
    Length: 2, dtype: object
    >>> sd.values
    array(['a', 'b'], dtype=object)

    三,序列数据的转换

    转换序列数据值的类型:

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

    把序列转换为NumPy数组:

    Series.to_numpy(self, dtype=None, copy=False)

    把序列转换为list:

    Series.to_list(self)

    四,访问序列的元素

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

    1,通过索引来访问序列

    对于序列,通过索引来访问序列元素的格式是:Sereis[index],索引可以是整数,也可以是字符类型的标签:

    >>> sd[102]
    'b'

    通过属性来访问序列的元素值

    2,at和iat属性,用于访问序列的单个元素值

    at属性通过索引访问单个序列值

    >>> sd.at[102]
    'b'

    iat属性表示通过位置访问序列的单个元素值:

    >>> sd.iat[0]
    'a'

    3,loc和iloc,通过序列的位置来访问元素

    iloc:基于整数位置的索引,用于按位置选择序列元素

    • 单个位置索引,比如sd.iloc[1]
    • 位置索引的列表,比如 sd.iloc[[0,1]]
    • 整数序列,比如,sd.iloc[0:2]
    • 布尔值数组,sd.iloc[[True, False, True, False]]

    loc:通过索引标签和布尔值数组来选择序列的元素

    举个例子,通过整数位置来选择序列的元素:

    >>> sd.iloc[0:2]
    idx_name
    101    a
    102    b
    Name: series_name, dtype: object

    举个例子,通过索引的标签来选择序列的元素:

    >>> sd.loc[[101,102]]
    idx_name
    101    a
    102    b
    Name: series_name, dtype: object

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

    在上面的例子中,[101,102] 称作索引数组,如果索引数据的元素类型是布尔类型,并且索引数组的元素数量和序列相同,那么把这种索引数组称作位置掩码。当位置为True时,表示选择该元素;当位置为False,表示不选择该元素。

    >>> sd.loc[[True,False]]
    idx_name
    101    a
    Name: series_name, dtype: object

    5,获得懒惰迭代器

    可以通过序列的__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.

    例如,通过items()函数获得序列的迭代器,并通过for循环来打印序列的值

    >>> for t in sd.items():
    ...     print(t)
    ... 
    ('b', 12)
    ('a', 13)
    ('d', 14)
    ('c', 10)

    五,序列的条件索引

    按照条件选择序列的特定行,可以使用序列的loc或iloc属性,并使用布尔索引来筛选序列的数据行:

    >>> sd.loc[sd>12]
    a    13
    d    14
    dtype: int64

    也可以使用逻辑表达式对条件进行组合计算:

    >>> sd.loc[(sd>12) & (sd<14)]
    a    13
    dtype: int64
    >>> sd.loc[(sd>12) | (sd<14)]
    b    12
    a    13
    d    14
    c    10
    dtype: int64

    注意,必须用小括号把两个逻辑表达式括起来,不然会报错:

    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

    查看序列的逻辑表达式的值:

    >>> (sd>12) & (sd<14)
    b    False
    a     True
    d    False
    c    False
    dtype: bool

    六,序列的基本操作

    1,删除元素的元素

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

    Series.drop(self, labels=None)

    2,对序列元素执行条件查询

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

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

    3,把序列追加到一个序列末尾

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

    Series.append(self, to_append, ignore_index=False, verify_integrity=False)

    4,重索引

    重索引是指按照新的索引对序列的元素进行重新排列,如果某个索引值不存在,就形成一个空洞,默认情况下,在空洞处插入缺失值:

    Series.reindex(self, index=None, **kwargs)

    参数 **kwargs 表示数据不固定的参数,其中有:

    method:表示插补缺失值的方法,有效值有{None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}

    • None 表示插入缺失值nan
    • ‘backfill’/’bfill’:表示使用空洞之后的最近的有效值来填充
    • ‘pad’/’ffill’:表示使用空洞之前的最近的有效值来填充
    •  ‘nearest’:表示使用最靠近空洞的有效值来填充

    fill_value:填充的值,默认值是nan

    参考文档:

    pandas Series

  • 相关阅读:
    【bzoj2100】[Usaco2010 Dec]Apple Delivery 最短路
    【bzoj2190】[SDOI2008]仪仗队 欧拉函数
    【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
    【bzoj1821】[JSOI2010]Group 部落划分 Group Kruskal
    【bzoj1877】[SDOI2009]晨跑 费用流
    【bzoj2834】回家的路 分层图最短路
    【bzoj1579】[Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路
    在UIElement外面多套一层布局面板(Grid、StackPanel)的意义
    在Window工作区按下鼠标左键拖动窗体
    滚动条——WPF ScrollViewer的应用
  • 原文地址:https://www.cnblogs.com/ljhdo/p/11514685.html
Copyright © 2011-2022 走看看