一维数据结构:Series
In [1]:
import numpy as np
import pandas as pd
Series
是一维带标记的数组结构,可以存储任意类型的数据(整数,浮点数,字符串,Python
对象等等)。
作为一维结构,它的索引叫做 index
,基本调用方法为
s = pd.Series(data, index=index)
其中,data
可以是以下结构:
- 字典
ndarray
- 标量,例如
5
index
是一维坐标轴的索引列表。
从 ndarray 构建
如果 data
是个 ndarray
,那么 index
的长度必须跟 data
一致:
In [2]:
s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
s
Out[2]:
a -0.032806
b 0.050207
c -1.909697
d -1.127865
e -0.073793
dtype: float64
查看 index
:
In [3]:
s.index
Out[3]:
Index([u'a', u'b', u'c', u'd', u'e'], dtype='object')
如果 index
为空,那么 index
会使用 [0, ..., len(data) - 1]
:
In [4]:
pd.Series(np.random.randn(5))
Out[4]:
0 -0.376233
1 -0.474349
2 1.660590
3 0.461434
4 0.190965
dtype: float64
从字典中构造
如果 data
是个 dict
,如果不给定 index
,那么 index
将使用 dict
的 key
排序之后的结果:
In [5]:
d = {'a' : 0., 'b' : 1., 'c' : 2.}
pd.Series(d)
Out[5]:
a 0
b 1
c 2
dtype: float64
如果给定了 index
,那么将会按照 index
给定的值作为 key
从字典中读取相应的 value
,如果 key
不存在,对应的值为 NaN
(not a number, Pandas
中的缺失默认值):
In [6]:
pd.Series(d, index=['b', 'd', 'a'])
Out[6]:
b 1
d NaN
a 0
dtype: float64
从标量值构造
如果 data
是标量,那么 index
值必须被指定,得到一个值为 data
与 index
等长的 Series
:
In [7]:
pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
Out[7]:
a 5
b 5
c 5
d 5
e 5
dtype: float64
像 ndarray 一样使用 Series
In [8]:
s
Out[8]:
a -0.032806
b 0.050207
c -1.909697
d -1.127865
e -0.073793
dtype: float64
支持数字索引操作:
In [9]:
s[0]
Out[9]:
-0.032806330572971713
切片:
In [10]:
s[:3]
Out[10]:
a -0.032806
b 0.050207
c -1.909697
dtype: float64
mask
索引:
In [11]:
s[s > s.median()]
Out[11]:
a -0.032806
b 0.050207
dtype: float64
花式索引:
In [12]:
s[[4, 3, 1]]
Out[12]:
e -0.073793
d -1.127865
b 0.050207
dtype: float64
支持 numpy
函数:
In [13]:
np.exp(s)
Out[13]:
a 0.967726
b 1.051488
c 0.148125
d 0.323724
e 0.928864
dtype: float64
像字典一样使用 Series
也可以像字典一样使用 Series
:
In [14]:
s["a"]
Out[14]:
-0.032806330572971713
修改数值:
In [15]:
s["e"] = 12.
s
Out[15]:
a -0.032806
b 0.050207
c -1.909697
d -1.127865
e 12.000000
dtype: float64
查询 key
:
In [16]:
"e" in s
Out[16]:
True
In [17]:
"f" in s
Out[17]:
False
使用 key
索引时,如果不确定 key
在不在里面,可以用 get
方法,如果不存在返回 None
或者指定的默认值:
In [18]:
s.get("f", np.nan)
Out[18]:
nan
向量化操作
简单的向量操作与 ndarray
的表现一致:
In [19]:
s + s
Out[19]:
a -0.065613
b 0.100413
c -3.819395
d -2.255729
e 24.000000
dtype: float64
In [20]:
s * 2
Out[20]:
a -0.065613
b 0.100413
c -3.819395
d -2.255729
e 24.000000
dtype: float64
但 Series
和 ndarray
不同的地方在于,Series
的操作默认是使用 index
的值进行对齐的,而不是相对位置:
In [21]:
s[1:] + s[:-1]
Out[21]:
a NaN
b 0.100413
c -3.819395
d -2.255729
e NaN
dtype: float64
对于上面两个不能完全对齐的 Series
,结果的 index
是两者 index
的并集,同时不能对齐的部分当作缺失值处理。
Name 属性
可以在定义时指定 name
属性:
In [22]:
s = pd.Series(np.random.randn(5), name='something')
s.name
Out[22]:
'something'