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
类型不同,有几种情况
如果 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是延迟计算的.
可以从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占位符.
如果 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 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可以看作尺寸不变的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
使用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.
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 和是两个不同对象