要使用pandas,我们必须先了解它的两个主要的数据结构:Series,DataFrame
- Series
它是一种类似于一维数组的对象,由一组数据(各种Numpy数据类型)以及一种与之相关的数据标签(即索引)组成。仅仅由一种数据就可以产生最简单的Series:
In [3]: obj = Series([1,4,5,3])
In [4]: obj
Out[4]:
0 1
1 4
2 5
3 3
dtype: int64
Series的字符串表现形式为:索引在左边,其值在右边。因为没有对数据指定索引值,所以会自动创建一个0~N-1(N为数据的长度)的整数型索引。
我们可以通过Series的values和index属性获取其数组表示形式和索引对象:
In [5]: obj.values
Out[5]: array([1, 4, 5, 3])
In [7]: obj.index
Out[7]: RangeIndex(start=0, stop=4, step=1)
创建一个可以对各个数据点进行标记的索引的Series:
In [8]: obj2 = Series([1,3,5,3],index=['a','d','g','r'])
In [9]: obj2
Out[9]:
a 1
d 3
g 5
r 3
dtype: int64
In [12]: obj2.index
Out[12]: Index(['a', 'd', 'g', 'r'], dtype='object')
我们还可以将Series看成是一个定长的有序字典,因为它是一个从索引值到数据值的映射。它可以用在许多原本需要字典参数的函数中:
In [13]: 'a' in obj2
Out[13]: True
In [14]: 'b' in obj2
Out[14]: False
如果数据被存放在一个Python字典中,也可以直接通过该字典来创建Series:
In [15]: dict1 = {'iphone':100,'xiaomi':200,'huawei':400}
In [16]: obj3 = Series(dict1)
In [17]: obj3
Out[17]:
iphone 100
xiaomi 200
huawei 400
dtype: int64
如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)
In [18]: states = ['xiaomi','apple','huawei','vivo']
In [19]: obj4 = Series(dict1,index=states)
In [20]: obj4
Out[20]:
xiaomi 200.0
apple NaN
huawei 400.0
vivo NaN
dtype: float64
在上面这个例子中,dict1中跟states索引相匹配的那两个值会被找出来并放到相应的位置上。但是由于‘apple’和‘vivo’所对应的dict1值找不到,所以其结果久违NaN(即非数字,在pandas中,它用于表示缺失或者NA值)。在pandas中,可以用isnull和notnull函数检测缺失数据:
In [21]: pd.isnull(obj4)
Out[21]:
xiaomi False
apple True
huawei False
vivo True
dtype: bool
In [22]: pd.notnull(obj4)
Out[22]:
xiaomi True
apple False
huawei True
vivo False
dtype: bool
Series也有类似的实例方法:
In [24]: obj4.isnull()
Out[24]:
xiaomi False
apple True
huawei False
vivo True
dtype: bool
对于许多应用来说,Series最重要的一个功能就是:它在算术运算中会自动对齐不同索引的数据:
In [25]: obj3
Out[25]:
iphone 100
xiaomi 200
huawei 400
dtype: int64
In [26]: obj4
Out[26]:
xiaomi 200.0
apple NaN
huawei 400.0
vivo NaN
dtype: float64
In [27]: obj3+obj4
Out[27]:
apple NaN
huawei 800.0
iphone NaN
vivo NaN
xiaomi 400.0
dtype: float64
Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:
In [29]: obj4.index.name = 'Type'
In [30]: obj4.name = 'number'
In [31]: obj4
Out[31]:
Type
xiaomi 200.0
apple NaN
huawei 400.0
vivo NaN
Name: number, dtype: float64
Series的索引可以通过赋值的方式被就地修改
In [32]: obj.index = [' bob','alice','coco','anan']
In [33]: obj
Out[33]:
bob 1
alice 4
coco 5
anan 3
dtype: int64