pandas之Series结构介绍

在对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种方案:

直接赋值:

s['e']=12

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

    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

三. 删除元素

python的del语句
直接通过索引删除。

s=pd.Series([1,2,3,4])
del s[3]
print(s)

Out[14]:
0    1
1    2
2    3
dtype: int64

Series的pop()函数:弹出某个索引的值,并将其删除。

Series.pop(index)  #index是索引,只能是一个值,不能是序列

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

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

四. 修改元素

通过索引直接修改
可以通过索引直接修改元素,或者通过切片批量修改元素。

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

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,后面我们会来学习。

位置下标
索引标签
位置/标签序列
切片
布尔型
函数

位置下标与标签索引

s=pd.Series([1,2,3],index=['a','b','c'])
print(s[0]) #位置下标从0开始
print(s['b'])
Out[18]:
1
2

位置/标签序列索引

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

Out[20]:
a    1
c    3

切片
这里需要注意,与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

布尔型索引

s=pd.Series([1,2,3],index=['a','b','c'])
print(s[(s>1) & (s<3)])

Out[22]:
b    2

函数

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。

作者:躺在稻田里的小白菜
链接:https://www.jianshu.com/p/e4f856ab8263

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值