美文网首页我爱编程
pandas(二)Series结构介绍

pandas(二)Series结构介绍

作者: 躺在稻田里的小白菜 | 来源:发表于2018-05-21 13:14 被阅读0次

    在对pandas基本结构有了大概的认识后,我们接下来要开始上手,学习如何在这些结构上进行创建,修改,添加,删除,查找等操作。首先我们开始学习Series结构。

    一. 创建一个Series

    创建一个最基本的Series结构,代码如下:

    s = pd.Series(data, index=index)
    

    data是数据值,是可选参数,不填则创建空Series对象;index是自定义的索引列表,是可选择参数,默认是从0开始的递增序列。其中,data可以是很多类型:

    • 数组型结构(列表,元组,ndarray等)

    此时若要自定义index,则index长度必需和数组长度一致。

    s=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
    
    • 字典结构

    若不指定index,则字典中的key作为索引,value作为数据值;若指定了索引,则会发生数据对齐(无论什么时候,索引与数据都是对应的,除非人为的改变他们,如果出现了新的索引,那么数据值将为空)。

    dict = {'a':0, 'b':1, 'c':2}
    s=pd.Series(dict, index=['b','c','d', 'a'])
    
    Out[11]: 
    b     1
    c     2
    d   NaN
    a     0
    dtype: float64
    
    • 标量值(数字,字符串)

    若不指定index,则会创建只有一个元素的series;若指定了index,那么所有索引对应的数据值都是该标量。

    s=pd.Series('apple',index=[1,2,3,4])
    print(s)
    
    Out[12]:
    1    apple
    2    apple
    3    apple
    4    apple
    dtype: object
    

    二. 增加元素

    在创建好的Series对象中添加元素,常见的有2种方案:

    1. 直接赋值:
    s['e']=12
    

    这种方法有风险,若原Series中已经存在索引e,则e对应的数据值将被改为12,;若不存在索引e,则添加新索引和数据。

    1. append()函数
      append()函数是Series的成员函数,用于连接2个Series对象,该函数会返回一个新的合并后的对象,且不改变原Series
    pandas.Series.append(to_append, ignore_index=False, verify_integrity=False)
    
    • to_append:目标Series
    • ignore_index: True为重新构建索引,False则保留原Series索引(可能会重复)
    • verify_integrity:True为检测合并后是否有索引冲突,存在则报错
    s=pd.Series([1,2,3,4])
    s=s.append(pd.Series(5,index=[2]),ignore_index=True)
    print(s)
    
    Out[13]:
    0    1
    1    2
    2    3
    3    4
    4    5
    

    三. 删除元素

    1. python的del语句
      直接通过索引删除。
    s=pd.Series([1,2,3,4])
    del s[3]
    print(s)
    
    Out[14]:
    0    1
    1    2
    2    3
    dtype: int64
    
    1. Series的pop()函数
      弹出某个索引的值,并将其删除。
    Series.pop(index)  #index是索引,只能是一个值,不能是序列
    

    该函数是Series的成员函数,它会返回索引位置的值,然后将其从Series中删除,若索引不存在,则会报错。

    1. Series的drop()函数
      根据索引批量删除数据,但不会改变原函数。
    s=pd.Series([1,2,3,4])
    s1=s.drop([2,3])
    print(s)
    print(s1)
    
    Out[15]:
    0    1
    1    2
    2    3
    3    4
    dtype: int64
    0    1
    1    2
    dtype: int64
    

    四. 修改元素

    1. 通过索引直接修改
      可以通过索引直接修改元素,或者通过切片批量修改元素。
    s=pd.Series([1,2,3,4])
    s[0]=6
    s[1:3]=12
    print(s)
    
    Out[16]:
    0     6
    1    12
    2    12
    3     4
    dtype: int64
    
    1. update()函数
    pandas.Series.update(other_s)
    

    该函数是Series成员函数,它通过其他Series来更新自身。更新操作只会更新那些,原Series与other_s中共有的索引。other_s中其余的值不会被插入到原Series中。
    举个例子:

    s = pd.Series(['a', 'b', 'c'])
    s.update(pd.Series(['d', 'e'], index=[0, 2]))
    
    Out[17]:
    0    d
    1    b
    2    e
    dtype: object
    

    若other_s中共同索引对应的值为nan,那么将不会被更新到原索引中。

    s = pd.Series([1, 2, 3])
    s.update(pd.Series([4, np.nan, 6]))
    
    Out[18]:
    0    4
    1    2
    2    6
    dtype: int64
    

    五. 查找与索引

    PANDAS是基于Numpy设计的,所以保留了Numpy访问数组的方法,常用的索引操作方式主要包括:

    • 点字符‘ . ’(Series属性)
    • 中括号[ ]
    • loc
    • iloc
    (一)点字符

    Series可以使用 ‘. 索引’ 的方法直接访问值。前提是索引标签符合Python命名标准(比如s.1就是不合法的),同时不能与函数名,保留字等发生冲突。

    s=pd.Series([1,2,3],index=['a','b','c'])
    print(s.b)
    
    (二)中括号

    Series利用中括号索引时,常见的输入主要包括以下几种。注意,当我们定义的索引标签为数字时,会与位置下标发生歧义,所以在使用中括号访问数据时,我不推荐使用位置下标,都使用索引标签,避免发生歧义。pandas为了解决这种歧义,不推荐使用中括号访问数据,取而代之的是使用基于索引标签的loc,与基于位置下标iloc,后面我们会来学习。

    • 位置下标
    • 索引标签
    • 位置/标签序列
    • 切片
    • 布尔型
    • 函数
    1. 位置下标与标签索引
    s=pd.Series([1,2,3],index=['a','b','c'])
    print(s[0]) #位置下标从0开始
    print(s['b'])
    Out[18]:
    1
    2
    
    1. 位置/标签序列索引
    s=pd.Series([1,2,3],index=['a','b','c'])
    print(s[['a','c']])
    
    Out[20]:
    a    1
    c    3
    
    1. 切片
      这里需要注意,与Python语法不同,索引标签切片,包含尾部;位置切片与Python语法相同,不包含尾部
    s=pd.Series([1,2,3],index=['a','b','c'])
    print(s['a':'c'])
    print(s[0:2])
    Out[21]:
    a    1
    b    2
    c    3
    
    a    1
    b    2
    
    dtype: int64
    
    1. 布尔型索引
    s=pd.Series([1,2,3],index=['a','b','c'])
    print(s[(s>1) & (s<3)])
    
    Out[22]:
    b    2
    
    1. 函数
    s=pd.Series([1,2,3,4])
    print(s[lambda x:x>2])
    Out[22]:
    2    3
    3    4
    
    (三)基于标签的loc方法(推荐)

    使用loc方法进行数据访问时,必须严格使用索引标签,否则会报错,数字索引标签是支持的,但是数字一定会被理解为标签,而不是位置。如果要访问的索引标签在数据中不存在,也会被报错。
    使用loc时的输入如下,使用方法和中括号相似:

    • 索引标签
    • 标签序列
    • 切片
    • 布尔型
    • 函数
      切片索引时要注意:
      与Python语法不同,标签切片,左闭右闭;位置切片,左闭右开。所以,loc的切片都是左闭右闭
    s=pd.Series([1,2,3],index=['a','b','c'])
    print(s.loc['a':'b'])
    Out[25]:
    a    1
    b    2
    dtype: int64
    
    (四)基于位置的iloc方法(推荐)

    iloc方法与loc方法很类似,区别在于iloc仅支持位置下标索引,否则报错,下标位置从0开始。
    使用iloc时的输入如下,使用方法和中括号相似:

    • 位置下标
    • 位置序列
    • 切片
    • 布尔型
    • 函数
      切片索引时要注意:
      与Python语法不同,标签切片,左闭右闭;位置切片,左闭右开。所以,iloc的切片都是左闭右开

    六.Series最主要的性质:自动对齐

    Series和其他数组最关键的区别在于,Series间的操作会自动根据标签对齐数据。因此,你可以直接编写计算,而不用考虑所涉及到的Series是否具有相同的标签。

    s=pd.Series([1,2,3],index=['a','b','c'])
    s1=pd.Series([2,4,6],index=['a','b','d'])
    print(s+s1)
    
    Out[27]:
    a    3.0
    b    6.0
    c    NaN
    d    NaN
    dtype: float64
    

    可以看到,相同索引的值进行了相加运算,没有匹配的索引被引入了空值nan。

    相关文章

      网友评论

        本文标题:pandas(二)Series结构介绍

        本文链接:https://www.haomeiwen.com/subject/yrizrftx.html