Series 是一个一维带标签数组,可以保存任意数据类型。轴标签也称为索引。
创建Series
s = pd.Series(data, index=index)
其中参数 index 是一个轴标签list。data 可以以下三种:
- python字典
如 d = {'b': 1, 'a': 0, 'c': 2},直接传入字典。
如果没有传入 index 参数,在高于0.23的pandas版本中,会根据字典本身的顺序排序,即 ['b', 'a', 'c']。在低于0.23的版本中,会根据字典中 key 的字典序排序,即 ['a', 'b', 'c']。
如果传入了 index 参数,则根据传入的参数,对数据排序。 - 一个ndarray
这时 index 必须同 data 有一样的长度。
In:s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
Out:
a 0.469112
b -0.282863
c -1.509059
d -1.135632
e 1.212112
dtype: float64
如果没有传入 index 参数,则用 [0, ..., len(data)-1] 作为索引。
- 一个标量值
但是用标量创建Series时,必须传入 index 参数,并且所有索引下的数据都为相同的指定标量。
pandas支持不唯一索引,如果执行一个不支持重复索引的运算,则可能报错。
Series作为一个类ndarry对象
Series非常类似于ndarray,大多数Numpy函数都对Series同样有效,只是对Series的所有操作都同时影响索引。如切片操作会同时截取相应的索引。
pandas Series和Numpy array一样 具有dtype属性s.dtype
。
大多数情况下,该属性都为Numpy的数据类型。但作为一个扩展子Numpy的第三方库,pandas也有一些自己的数据类型,如Categorical data和 Null integer data type。
s.array
属性,保存了Series 底层存储的数组。当需要进行一些不需要索引的操作时,使用该数组会很有用。
s.array
总是一个pandas.api.extensions.ExtensionArray,是对一个或多个具体数组(如ndarray)的简单封装。pandas利用ExtensionArray来将具体数据存在Series中,或存在DataFrame的列中。
如果你需要使用ndarray,可以使用s.to_numpy()
返回一个ndarray。
Series作为一个类字典对象
一个 Series 是一个固定大小的字典,你可以通过索引标签来 get 或 set 字典值。
s['a']
获取索引为 a 的值,s['a'] = 12
则更改索引为 a 的值为12。
使用 get 方法有同样的效果,当对不存在指定索引时返回None 或指定的默认返回值:
In: s.get('f', np.nan)
Out: nan
'a' in s
返回布尔值,判断索引 a 是否在Series中。
向量化操作和标签对齐
当使用原生Numpy数组时,往往不需要按数组值进行循环操作,这称为向量化。在使用Series时,也是一样,Series同样可以当做一个ndarray传给大多数Numpy方法。如:
s + s
s * 2
np.exp(s)
均对数据进行元素级运算。
Series 和 ndarray 之间的一个关键的不同,是Series之间的运算会自动地基于标签进行。你可以直接编写运算,而不需考虑参与运算的Series是否具有相同的索引标签。
In: s[1:] + s[:-1]
Out:
a NaN
b -0.565727
c -3.018117
d -2.271265
e NaN
dtype: float64
结果中包含各Series索引的并集。当一个Series的索引无法在另一个Series中找到时,对应索引会标记为NaN。不需要任何明确的数据对齐的代码,保证了交互式数据分析和研究中极大的自由和灵活性。
名称属性
Series还有一个name
属性:
s = pd.Series(np.random.randn(5), name='something')
通过s.name
获取,使用s.rename
方法可以重命名并返回一个新的Series对象。
网友评论