pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具。pandas基于NumPy构建,让以NumPy为中心的应用变得更加简单。
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
pandas的两个主要数据结构是:Series和DataFrame。
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据索引组成。
obj = Series([4, 7, -5, 3])
obj
# Series的字符串表现形式为:索引在左边,值在右边。
# 由于我们没有为数据指定索引,于是会自动创建一个0到N-1的整数索引
0 4 1 7 2 -5 3 3 dtype: int64
# 获取Series的values和index属性
obj.values
array([ 4, 7, -5, 3], dtype=int64)
obj.index
Int64Index([0, 1, 2, 3], dtype='int64')
# 创建Series带有可以对各个数据点进行标记的索引
obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
d 4 b 7 a -5 c 3 dtype: int64
obj2.index
Index([u'd', u'b', u'a', u'c'], dtype='object')
obj2['a']
-5
obj2
d 4 b 7 a -5 c 3 dtype: int64
# 布尔表达式过滤
obj2[obj2 > 0]
d 4 b 7 c 3 dtype: int64
# 标量乘法
obj2 * 2
d 8 b 14 a -10 c 6 dtype: int64
# 应用数学函数
np.exp(obj2)
d 54.598150 b 1096.633158 a 0.006738 c 20.085537 dtype: float64
将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。
'b' in obj2
True
'e' in obj2
False
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
# 传入Python字典,原字典的键成为Series的索引
obj3 = Series(sdata)
obj3
Ohio 35000 Oregon 16000 Texas 71000 Utah 5000 dtype: int64
sindex = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index=sindex)
# sdata中跟states索引项匹配的值会被找出来并放到相应的位置上
obj4
California NaN Ohio 35000 Oregon 16000 Texas 71000 dtype: float64
obj4.isnull()
California True Ohio False Oregon False Texas False dtype: bool
obj3 + obj4
California NaN Ohio 70000 Oregon 32000 Texas 142000 Utah NaN dtype: float64
obj4.name = 'population'
obj4.index.name = 'state'
obj4
state California NaN Ohio 35000 Oregon 16000 Texas 71000 Name: population, dtype: float64
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
obj
Bob 4 Steve 7 Jeff -5 Ryan 3 dtype: int64
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(功用同一个索引)。
最常用是直接传入一个由等长列表或NumPy数组组成的字典
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
frame
# DataFrame会自动加上索引,且全部被有序排列
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
# 如果指定列序列,则DataFrame的列就会按照指定顺序进行排列
DataFrame(data, columns=['year', 'state', 'pop'])
year | state | pop | |
---|---|---|---|
0 | 2000 | Ohio | 1.5 |
1 | 2001 | Ohio | 1.7 |
2 | 2002 | Ohio | 3.6 |
3 | 2001 | Nevada | 2.4 |
4 | 2002 | Nevada | 2.9 |
# 如果传入的列在数据中找不到,就会产生NA值
frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five'])
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | NaN |
five | 2002 | Nevada | 2.9 | NaN |
通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
frame2['state']
one Ohio two Ohio three Ohio four Nevada five Nevada Name: state, dtype: object
frame2.year
one 2000 two 2001 three 2002 four 2001 five 2002 Name: year, dtype: int64
返回的Series拥有原DataFrame相同的索引,且其name属性已经被设置好了
用索引字段ix可以获得DataFrame的一行
frame2.ix['three']
year 2002 state Ohio pop 3.6 debt NaN Name: three, dtype: object
列可以通过赋值的方式进行修改
frame2['debt'] = 16.5
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 16.5 |
two | 2001 | Ohio | 1.7 | 16.5 |
three | 2002 | Ohio | 3.6 | 16.5 |
four | 2001 | Nevada | 2.4 | 16.5 |
five | 2002 | Nevada | 2.9 | 16.5 |
将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引
frame2['debt'] = [1, 2, 3, 4, 5]
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 1 |
two | 2001 | Ohio | 1.7 | 2 |
three | 2002 | Ohio | 3.6 | 3 |
four | 2001 | Nevada | 2.4 | 4 |
five | 2002 | Nevada | 2.9 | 5 |
val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | -1.2 |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | -1.5 |
five | 2002 | Nevada | 2.9 | -1.7 |
为不存在的列赋值会创建出一个新列
frame2['eastern'] = frame2.state == 'Ohio'
frame2
year | state | pop | debt | eastern | |
---|---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN | True |
two | 2001 | Ohio | 1.7 | -1.2 | True |
three | 2002 | Ohio | 3.6 | NaN | True |
four | 2001 | Nevada | 2.4 | -1.5 | False |
five | 2002 | Nevada | 2.9 | -1.7 | False |
关键字del用于删除列
del frame2['eastern']
frame2.columns
Index([u'year', u'state', u'pop', u'debt'], dtype='object')
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | -1.2 |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | -1.5 |
five | 2002 | Nevada | 2.9 | -1.7 |
通过索引方式返回的列只是相应数据的视图而已,并不是副本。对返回的Series所做的任何修改都会反映到原DataFrame上。通过Series的copy方法即可显式地复制列。
如果数据形式是嵌套字典(字典的字典),将它传给DataFrame,它会被解释为:外层的键作为列,内层的键则作为行索引。
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = DataFrame(pop)
frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 1.7 |
2002 | 2.9 | 3.6 |
# 对结果进行转置
frame3.T
2000 | 2001 | 2002 | |
---|---|---|---|
Nevada | NaN | 2.4 | 2.9 |
Ohio | 1.5 | 1.7 | 3.6 |
可以输入给DataFrame构造器的数据:
# 设置DataFrame的index和columns的name属性,并显示出来
frame3.index.name = 'year'
frame3.columns.name = 'state'
frame3
state | Nevada | Ohio |
---|---|---|
year | ||
2000 | NaN | 1.5 |
2001 | 2.4 | 1.7 |
2002 | 2.9 | 3.6 |
DataFrame的values属性会以二维ndarray的形式返回DataFrame中的数据
frame3.values
array([[ nan, 1.5], [ 2.4, 1.7], [ 2.9, 3.6]])
pandas的索引对象负责轴标签和其他元数据(比如轴名称等),构建Series或DataFrame时, 所用到的任何数组或其他序列的标签都会被转换成一个Index。Index对象是
obj = Series(range(3), index=['a','b','c'])
index = obj.index
index
Index([u'a', u'b', u'c'], dtype='object')
index[1:]
Index([u'b', u'c'], dtype='object')