当前位置: 首页 > 工具软件 > X-Series > 使用案例 >

pandas - Series

穆彬郁
2023-12-01

重点

  • Series 创建时需要data/index两个信息
  • Series可以通过array/dict/scalar创建
  • Series可以看作dict/ndarray,和numpy互通
  • Series计算时自动按标签对齐

Series是带标签的一维数组,支持任意数据类型(整型,字符传,浮点数,python对象等). 标签一般称为index,生成一个Series的
函数是

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

其中 data d a t a 可以是不同的类型:
* python dict
* ndarray
* 标量,比如5
index i n d e x 传入的是一个标签list.根据 data d a t a 类型不同,有几种情况

From ndarray

如果 data d a t a 是ndarray类型, index i n d e x 必须和 data d a t a 长度一致.如果 index i n d e x 没有设置,默认值是 [0,...,len(data)1] [ 0 , . . . , l e n ( d a t a ) − 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允许重复的 index i n d e x 值.不支持重复 index i n d e x 值的操作会触发异常. 这样做也是为了性能考虑,pandas是延迟计算的.

From dict

可以从dicts创建Series

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

In [8]: pd.Series(d)
Out[8]: 
b    1
a    0
c    2
dtype: int64

注意:对于python版本>=3.6, pandas版本>=0.23, 如果 index i n d e x 没有设置, Series S e r i e s 次序和dict插入次序一致.对于python<3.6或pandas<0.23,没有设置 index i n d e x , Series S e r i e s 按照dict的key的字典次序排序
在上面的例子中,如果python<3.6或pandas<0.23, Series S e r i e s 按照字典次序对dict key排序( [a,b,c] [ a , b , c ] 而不是 [b,a,c] [ b , a , c ] )
如果设置了 index i n d e x , data d a t a 中和标签一致的 index i n d e x 将被用来做索引

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(not a number)是pandas中missing data占位符.

From scale value

如果 data d a t a 是标量,必须设置 index i n d e x ,此时标量会被重复,保证和 index i n d e x 尺寸一致

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 is ndarray-like

Series S e r i e s 表现的和 ndarray n d a r r a y 很相似,可以作为numpy大部分函数的参数.Howerver,operations such as slicing will also slice the index.

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 is dict-like

Series可以看作尺寸不变的dict,通过 index i n d e x 可以读取或写入值

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函数,不存在的label会返回None或设置的默认值

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

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

Vectorized operations and label alignment with Series

使用numpy数组时,不推荐遍历逐个元素,pandas中同样也不推荐.panda Series可以被当作numpy数组传递给大部分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之间的操作可以不必考虑是否有相同的标签(译注:不同的标签之间不会计算,输出NaN)

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的标签对应的结果是NaN.这种行为对交互式数据分析和研究带了极大便利.这种标签对齐的特性把panda和其他基于标签的工具区分开.

注意:具有不同index的对象之间的操作,默认会保留index的并集,这样可以避免信息损失.虽然没有数据,但是标签依然是计算中的重要信息.可以通过dropna函数丢弃miss data.

Name attribute

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大多数情况下会自动设置,尤其DataFrame的一维切片操作中.

0.18.0版本以后可以利用pandas.Series.rename()函数重命名

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

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

注意上述代码中 s s s2是两个不同对象

 类似资料: