pandas中文文档
作者: 杨志勇
Series

Series是一维标签数组,能够保存任何数据类型(整数,字符串,浮点数,Python对象等)。 轴标签统称为索引。 创建Series的基本方法是调用:

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

这里data参数可以是许多不同的对象:

  • Python dict
  • ndarray
  • 标量值(如5)

传递的索引是轴标签列表。 因此,根据数据的不同,可分为几种情况:

来自ndarray

如果数据是ndarray,则索引的长度必须与数据的长度相同。 如果没有传递索引,将创建一个具有值[0,...,len(data) - 1]的索引。
In [3]: s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])

In [4]: s
Out[4]: 
a    0.4691
b   -0.2829
c   -1.5091
d   -1.1356
e    1.2121
dtype: float64

In [5]: s.index
Out[5]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

In [6]: pd.Series(np.random.randn(5))
Out[6]: 
0   -0.1732
1    0.1192
2   -1.0442
3   -0.8618
4   -2.1046
dtype: float64
  • 注意:pandas支持非唯一索引值。 如果尝试不支持重复索引值的操作,则会引发异常。 延迟加载的原因几乎都是基于性能的(计算中有很多实例,比如GroupBy中没有使用索引的部分)。

来自dict

Series可以通过dict实例化:

In [7]: d = {'b' : 1, 'a' : 0, 'c' : 2}

In [8]: pd.Series(d)
Out[8]: 
b    1
a    0
c    2
dtype: int64
  • 注意当数据是dict,并且未传递索引时,如果您使用的是Python版本> = 3.6且Pandas版本> = 0.23,则Series的索引将按dict的插入顺序排序。如果您使用的是Python <3.6或Pandas <0.23,并且未传递索引,则Series的索引将按dict键值的字母顺序排列。

在上面的示例中,如果您使用的Python版本低于3.6或Pandas版本低于0.23,则Series将按字典键的字母顺序排序(即['a','b','c'] 而不是['b','a','c'])。
如果传递索引,则将拉出与索引中的标签对应的数据中的值。

In [9]: d = {'a' : 0., 'b' : 1., 'c' : 2.}

In [10]: pd.Series(d)
Out[10]: 
a    0.0
b    1.0
c    2.0
dtype: float64

In [11]: pd.Series(d, index=['b', 'c', 'd', 'a'])
Out[11]: 
b    1.0
c    2.0
d    NaN
a    0.0
dtype: float64
  • 注意:NaN(不是数字)是pandas中使用的标准缺失数据标记。

来自标量值

如果数据是标量值,则必须提供索引。 将重复该值以匹配索引的长度。
In [12]: pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
Out[12]: 
a    5.0
b    5.0
c    5.0
d    5.0
e    5.0
dtype: float64

Series 与 ndarray 相似

Series与ndarray非常相似,是大多数NumPy函数的有效参数。 但是,切片等操作也会对索引进行切片。
In [13]: s[0]
Out[13]: 0.46911229990718628

In [14]: s[:3]
Out[14]: 
a    0.4691
b   -0.2829
c   -1.5091
dtype: float64

In [15]: s[s > s.median()]
Out[15]: 
a    0.4691
e    1.2121
dtype: float64

In [16]: s[[4, 3, 1]]
Out[16]: 
e    1.2121
d   -1.1356
b   -0.2829
dtype: float64

In [17]: np.exp(s)
Out[17]: 
a    1.5986
b    0.7536
c    0.2211
d    0.3212
e    3.3606
dtype: float64
我们将在单独的章节中讨论基于数组的索引。

Series 与dict相似

Series类似于固定大小的dict,您可以通过索引标签获取和设置值:

In [18]: s['a']
Out[18]: 0.46911229990718628

In [19]: s['e'] = 12.

In [20]: s
Out[20]: 
a     0.4691
b    -0.2829
c    -1.5091
d    -1.1356
e    12.0000
dtype: float64

In [21]: 'e' in s
Out[21]: True

In [22]: 'f' in s
Out[22]: False

如果索引标签不存在,则会抛出异常:

>>> s['f']
KeyError: 'f'

使用get方法,缺少的标签将返回None或指定的默认值:

In [23]: s.get('f')

In [24]: s.get('f', np.nan)
Out[24]: nan

另请参考:属性访问相关的章节

Series的向量操作和标签对齐

使用原始NumPy数组时,通常不需要循环对每一个值进行操作。 在pandas中使用Series时也是如此。 Series也可以传递到大多数接收ndarray作为参数的NumPy方法。
In [25]: s + s
Out[25]: 
a     0.9382
b    -0.5657
c    -3.0181
d    -2.2713
e    24.0000
dtype: float64

In [26]: s * 2
Out[26]: 
a     0.9382
b    -0.5657
c    -3.0181
d    -2.2713
e    24.0000
dtype: float64

In [27]: np.exp(s)
Out[27]: 
a         1.5986
b         0.7536
c         0.2211
d         0.3212
e    162754.7914
dtype: float64

Series和ndarray之间的主要区别在于Series之间的操作会根据标签索引自动对齐数据。 因此,您可以不考虑参与计算的Series是否具有相同标签。

In [28]: s[1:] + s[:-1]
Out[28]: 
a       NaN
b   -0.5657
c   -3.0181
d   -2.2713
e       NaN
dtype: float64
未对齐的Series之间的操作结果将包含所涉及的索引的并集。 如果在一个Series或另一个Series中找不到标签,结果将被标记为缺少值NaN。 能够在不进行任何明确数据对齐的情况下编写代码,使得在交互式数据分析和研究中获得巨大的自由度和灵活性。 pandas数据自动对齐的特性,使得pandas有别于大多数其他对标签数据处理的工具。

注意

通常,我们选择不同索引对象之间的操作的默认结果:索引的并集,以避免信息丢失。 尽管缺少数据,但索引标签通常是重要的信息,作为计算的一部分。 您当然可以选择通过dropna函数删除缺少数据的标签。 

Name 属性

Series 可以有 name 属性:

In [29]: s = pd.Series(np.random.randn(5), name='something')

In [30]: s
Out[30]: 
0   -0.4949
1    1.0718
2    0.7216
3   -0.7068
4   -1.0396
Name: something, dtype: float64

In [31]: s.name
Out[31]: 'something'
在许多情况下,Series name属性将自动分配,特别是在获取1维切片的DataFrame时,如下所示。
版本0.18.0中的新功能。
您可以使用pandas.Series.rename()方法重命名Series。
In [32]: s2 = s.rename("different")

In [33]: s2.name
Out[33]: 'different'
注意这里‘s' 和 ’s2' 是不同的对象。
标签: series、float64、dtype、索引、pandas
一个创业中的苦逼程序员
  • 回复
隐藏