Pandas学习笔记-两种数据结构之Series

Pandas中含有两种主要的数据结构:Series和Dataframe,本篇笔记记录的是Series。

另一篇关于dataframe的https://blog.csdn.net/JT_WPC/article/details/104160416

笔记内容的结构:

  1. Series简介;

  2. 构建series的几种情况;

  3. Series的特点;

  4. Series的常见操作。

Series简介

Series的API文档传送门,介绍了Series的所有属性和方法。Series是一维的含有标记名的纵向数组,其中标记名指的是对应行的数据的名字,数据的类型任意(整数、字符串、浮点数、Python对象等)数据的标签统称为index默认情况下,数据对齐总是发生的。所谓数据对齐,指的是数据和标签名一一对应,除非是显式操作,否则不会中断标签和数据之间的对应关系。

首先导入numpy和pandas包:

import numpy as np
import pandas as pd

创建一个Series的基本语法是:

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

上面的代码中,data参数内容可以是:

  1. 一个python字典;

  2. 一个ndarray数组;

  3. 一个标量数值,例如,9

而后面的作为参数传进去的index,是每一行的行名称,也称为轴(axis)的标签,由于series为纵向数组,所以每一行只有一个元素。

 

构建Series

根据data参数类型的不同,可以分为如下几种情况来构建series:

1.从ndarray中获取数据:

如果data参数是一个ndarray类型,那么index的长度必须和data的相同,如果没有index参数传入,则会自动生成一个int类型的index,数值范围为[0,……,len(data)-1]。

tips:ndarray是numpy中生成数据的默认类型。

s = pd.Series(np.random.randn(5), index=['a','b', 'c', 'd', 'e'])  # 指定index

输出:s-------------------

a   -0.049119
b   -1.202170
c    2.024288
d    0.165342
e   -0.621071
dtype: float64

可以通过series的index属性查看设定的标签名:

s.index

--------------------
Index(['a',
       'b',
       'c',
       'd',
       'e'],
      dtype='object')
pd.Series(np.random.randn(5))  # 不指定index参数

--------------------
0   -0.389217
1   -0.890973
2   -1.056253
3    0.114149
4    0.040947
dtype: float64

请注意,pandas允许index值重复,如果尝试进行不支持重复index的操作,则会引发异常。

s = pd.Series(np.random.randn(5), index=['a','a', 'c', 'd', 'e']) 

输出s--------------------

a    1.287479
a   -0.410150
c    0.415739
d    1.003693
e    1.929771
dtype: float64

2.从字典中获取数据

从字典中获取数据构建Series时,字典的key转换为行标签,也就是axis的label。

d = {'b':1, 'a':0, 'c':2}
pd.Series(d)

--------------------
b    1
a    0
c    2
dtype: int64

 请注意,python推荐版本是3.6及以上,如果python版本小于3.6,可能出现生成的Series中数据按照key的字典顺序排序的情况。

如果data参数为字典类型的同时也传递了index参数,将会发生数据与标签的自动对齐:data中提取出与index中的标签对应的数据;当某标签没有对应值时,使用NaN作为缺失值进行填充

tips:NaNnot a number)在pandas中表示该数据缺失。

pd.Series(d, index=['a','b', 'c','d'])   # 这里按照index参数中的顺序自动对齐,用NaN表示缺失值

--------------------
a    0.0
b    1.0
c    2.0
d    NaN
dtype: float64

3.从标量中获取数据

如果数据是标量值,则必须提供index参数。标量值将被复制,用以匹配索引的长度。

pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])

--------------------
a    5.0
b    5.0
c    5.0
d    5.0
e    5.0
dtype: float64

Series的特点

pandas是在其他科学计算包的基础上发展起来的,因此和某些数据类型存在相似之处,这也为我们学习pandas提供了便利。

1.Series类似于ndarray

Series类似于ndarray,因此存在和ndarray相同的操作逻辑。Series也可以充当大多数NumPy函数的有效参数。诸如切片之类的操作也将对index进行切片。

'''
s中的内容
a    0.587248
b   -0.182482
c    0.764298
d    1.075891
e    0.168112
dtype: float64
'''
s[0]  # 输出位置0的内容
s[:3]  # 输出 [0:3) 范围里的内容
s[s > s.median()]  # 输出大于中位数的内容
s[[4, 3, 1]]  # 依次输出位置为4、3、1的内容
np.exp(s)  # 以e为底进行指数运算

依次输出以下内容--------------------
0.5872479154486413

a    0.587248
b   -0.182482
c    0.764298
dtype: float64

c    0.764298
d    1.075891
dtype: float64

e    0.168112
d    1.075891
b   -0.182482
dtype: float64

a    1.799031
b    0.833199
c    2.147486
d    2.932605
e    1.183069
dtype: float64

NumPy数组一样,pandasSeries也有dtype属性,用于获取series中数据的类型。

s.dtype

--------------------
dtype('float64')

这通常是一个NumPy dtypepandas和第三方库在一些地方扩展了NumPy的类型系统,此时,dtype应该是ExtensionDtype

使用series.array属性,从Series中得到一个真正的数组,然后像操作数组那样对其进行访问和修改,例如series.array[2] = 3:

s.array

--------------------
<PandasArray>
[  0.5872479154486413,
 -0.18248229943536817,
   0.7642976985377575,
   1.0758911939753029,
    0.168111559544036]
Length: 5, dtype: float64

2.Series类似于字典dict

series类似于固定大小的dict,可以通过index标签获取和设置值。

'''
s中的初始内容:
a    2.000000
b   -0.182482
c    0.764298
d    1.075891
e    0.168112
dtype: float64

'''
In : s['a']
Out: 2.000000

In : s['a'] = 3
In : s
Out: 
a    3.000000
b   -0.182482
c    0.764298
d    1.075891
e    0.168112
dtype: float64

In : 'e' in s
Out: True

In : 'f' in s
Out: False

如果进行索引时,使用的index标签不存在,则会引发异常,而不是自动添加,因为这里series的长度不可变:

In : s['f'] 
Out: ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\Anaconda3\envs\AI\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
...
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'f'

类似于字典的get方法,如果标签缺失,将返回None或指定的默认值:

In : s.get('f')

In : s.get('f', '不存在')
Out: '不存在'

Series的常用操作

1.向量化操作以及label和Series的对齐

在处理原始NumPy数组时,通常不需要逐个值地循环,在处理pandasseries时也是如此。series也可以作为参数传递到大多数NumPy方法中。

In : s + s
Out: 
a    6.000000
b   -0.364965
c    1.528595
d    2.151782
e    0.336223
dtype: float64

In : s * 2
Out: 
a    6.000000
b   -0.364965
c    1.528595
d    2.151782
e    0.336223
dtype: float64

Seriesndarray之间的一个关键区别是Series之间的操作会根据标签自动对齐数据。因此编写代码进行计算的时候不必考虑所涉及的Series是否具有相同的标签。例如下面的操作,对同一个series进行了不同的偏移,然后相加。计算时,仍然是对应的label进行相加,这就是自动对齐:

In : s[1:] + s[2:]
Out: 
b         NaN
c    1.528595
d    2.151782
e    0.336223
dtype: float64

2.name属性

Series也具有name属性,在生成Series的时候可以通过name参数进行设定,也可以在生成Series之后通过name属性进行设定和修改,但是正规点的修改的方式是使用Series的rename方法进行名字的修改。

In : s = pd.Series(np.random.randn(5), name='a_series')

In : s
Out: 
0   -0.494929
1    1.071804
2    0.721555
3   -0.706771
4   -1.039575
Name: a_series, dtype: float64

In : s.name
Out: 'a_series'

In : s.name = 'Wang_PChao'
In : s.name
Out: 'Wang_PChao'
In : s.rename("another_name")

In : s.name
Out: 'another_name'
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值