Pandas数据结构之Series(序列)

Pandas常用的数据结构有两大类:series序列data frame数据帧。由于panel面板被弃用,在这里,我们就不进行介绍了。其实panel是三维数据比较好用的数据容器。这篇文章将介绍Series数据类型。


Series 序列

创建序列

import pandas as pd
import numpy as np
s = pd.Series(data, index=index)

这里的data可以是Python字典,numpy的ndarray,也可以是一个实数。

从ndarray建立

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支持非唯一索引值。

从字典建立

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,则系列索引将按dict的插入顺序排序。
如果您使用的是Python < 3.6或Pandas < 0.23,并且未传递索引,则Series索引将是词汇顺序的dict键列表。

在上面的示例中,如果您使用的Python版本低于3.6或Pandas版本低于0.23,则系列将按字典键的词法顺序排序(即[‘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中只是一个缺省值的标志。与None不是一回事,与nul也不是一回事。

从实数构建

一个实数对应多个索引,则每个索引对应的值都是这个实数。

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

我们可以像操作dict和ndarray一样操作Series

比如我们可以用ndarray的切片方法

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

再比如我们用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

如果某个列标签不存在,则会返回一个错误提示keyError.
如果使用get方法,缺省值会返回None或者指定的默认值。

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

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

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

序列的向量操作

这种向量化的操作和R语言非常像,都是去操作序列的每个元素的。

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之间的操作会根据标签自动对齐数据。因此,您可以在不考虑所涉及的系列是否具有相同标签的情况下编写计算。

In [28]: s[1:] + s[:-1]
Out[28]: 
a       NaN
b   -0.5657
c   -3.0181
d   -2.2713
e       NaN
dtype: float64

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

序列的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'

In [32]: s2 = s.rename("different")

In [33]: s2.name
Out[33]: 'different'

以上内容参考https://www.pypandas.cn/document/dsintro/series.html

猜你喜欢

转载自blog.csdn.net/zhfplay/article/details/87106219