pandas含有使数据清洗和分析工作变得更快更简单的数据结构和操作工具。
pandas数据类型结构
Series和DataFrame是pandas两个主要的数据结构。
Series
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。
仅由一组数据即可产生最简单的Series:
import pandas as pd
from pandas import Series,DataFrame
obj = Series([4,7,-5,3])
ob
0 4
1 7
2 -5
3 3
dtype: int64
Series的字符串表现形式为:索引在左边,值在右边。上例没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
可以通过Series 的values和index属性获取其数组表示形式和索引对象:
>>> obj.values
array([ 4, 7, -5, 3], dtype=int64)
>>> obj.index
RangeIndex(start=0, stop=4, step=1)
创建带索引的Series:
>>> obj2 = pd.Series([4,7,-5,3],index=['d','b','a','c'])
>>> obj2
d 4
b 7
a -5
c 3
dtype: int64
选取Seriesde中的单个或一组值:
>>> obj2['a']
-5
>>> obj2[['c','a','d']]
c 3
a -5
d 4
dtype: int64
Numpy数组运算(根据布尔型书进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接:
>>> obj2
d 4
b 7
a -5
c 3
dtype: int64
>>> obj2[obj2 > 0]
d 4
b 7
c 3
dtype: int64
可以将Series看成是一个定长的有序字典,因为他是索引值到数据值的一个映射 。可以用字典函数:
>>> 'b' in obj2
True
通过字典创建Series:
sdata = {'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3 = pd.Series(sdata)
obj3
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
传入排好序的字典的键改变顺序
states = ['California','Ohio','Oregon','Texas']
obj4 = pd.Series(sdata,index=states)
obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
上例中,sdata中跟states索引匹配的那3个值会被找出来并放到相应的位置上
“Clifornia”对应的值到不到,结果就是NaN(非数字 not a number)pandas中,NaN表示缺失值或NA值。
pandas的isnull和notnull函数用于检测缺失数据:
pd.isnull(obj4)
California True
Ohio False
Oregon False
Texas False
dtype: bool
Series类似的实例方法:
>>> obj4.isnull()
California True
Ohio False
Oregon False
Texas False
dtype: bool
Series最重要的一个功能是会根据运算的索引标签自动对齐数据:可以认为是类似Join的操作
>>> obj3
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
>>> obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
>>> obj3 + obj4
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
Series对象本身以及其索引都有一个name属性,该属性跟pandas其他关键功能关系非常密切:
obj4.name = 'population'
obj4.index.name = 'state'
obj4
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
Series索引可以通过赋值的方式就地修改:
>>> obj
0 4
1 7
2 -5
3 3
dtype: int64
obj.index = ['Bob','Steve','Jeff','Ryan']
obj
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的序列,每列可以是不同的值类型(数值、字符串、布尔值)
DateFame 既有行索引也有列索引。
DataFrame中的数据是通过一个或多个二维块存放的(而不是列表、字典或别的一维数组结构)
注:虽然DataFrame是以二维结构保存数据的,但仍然可以轻松的将其表示为更高纬度的数据(层次化索引的表格型结构,这是pandas中许多高级处理功能的关键要素)
创建DataFrame
最常用的一种是直接传入一个由等长列表或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
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
按照制定的序列排序
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
跟Series一样,如果传入的列在数据中找不到,就会产生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
>>> frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
获取DataFrame列为一个Series:
>>> frame2['state']
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
Name: state, dtype: object
>>> frame2.year
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
注意到返回的Series拥有原DataFrame相同的索引,但其name 属性也被相应的设置好了。
获取一行
frame2.loc['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
frame2['debt'] = np.arange(5.)
frame2
year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0
将列表或数组赋值给某个列时,其长度必须跟DateFrame的长度匹配。
如果赋值的是一个Series,就会精确匹配到DataFrame的索引,所有的空位都将被填上缺失值
val = pd.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 0.0 True
two 2001 Ohio 1.7 1.0 True
three 2002 Ohio 3.6 2.0 True
four 2001 Nevada 2.4 3.0 False
five 2002 Nevada 2.9 4.0 False
删除列
del frame2['eastern']
frame2.columns
Index(['year', 'state', 'pop', &#