1. Series相当于数组numpy.array类似
s1=pd.Series([1,2,4,6,7,2]) s2=pd.Series([4,3,1,57,8],index=['a','b','c','d','e']) print s2 obj1=s2.values # print obj1 obj2=s2.index # print obj2 # print s2[s2>4] # print s2['b']
1.Series 它是有索引,如果我们未指定索引,则是以数字自动生成。
下面是一些例子:
obj=Series([4,7,-5,3])
print obj
#输出结果如下:
# 0 4
# 1 7
# 2 -5
# 3 3
print obj.values #取出它的值
#[ 4 7 -5 3]
print obj.index #取出索引值
#输出结果如下:
# RangeIndex(start=0, stop=4, step=1)
obj2=Series([4,7,-5,3],index=['d','b','a','c'])
print obj2
#输出结果如下:
# d 4
# b 7
# a -5
# c 3
#可以通过索引的方式选择Series中的单个或一组值
print obj2['a'] #输出结果:-5
print obj2['d'] #输出结是:4
2. Series的一些操作
Series.order()进行排序,而DataFrame则用sort或者sort_index
print ratings_by_title.order(ascending=False)[:10]
(1)Numpy数组运算(根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接
print obj2[obj2>0] #取出>0的值
#输出结果如下:
# d 4
# b 7
# c 3
print obj2*2
#输出结果如下:
# d 8
# b 14
# a -10
# c 6
(2)还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可以用在许多原来需要字典参数的函数中。
print 'b' in obj2 #obj2中有索引'b'?若有就返回'True'
(3)如果数据被存在一个python字典中,也可以直接通过这个字典来创建Series.
sdata={'Ohio':35000,'Texax':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
print obj3
#输出结果如下:
# Ohio 35000
# Oregon 16000
# Texax 71000
# Utah 5000
#注:如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)
states=['California','Ohio','Oregon','Texax']
obj4=Series(sdata,index=states) #将sdata字典创建Series,索引用states来创建
print obj4
#California在sdata中没有相应的值,故是NaN缺省值
# California NaN
# Ohio 35000.0
# Oregon 16000.0
# Texax 71000.0
(4)pandas中的isnull和notnull函数可以用于检测缺失数据,
Series也有类似的方法
print pd.isnull(obj4)
#输出结果如下:
# California True
# Ohio False
# Oregon False
# Texax False
# dtype: bool
print pd.notnull(obj4)
#输出结果如下:
# California False
# Ohio True
# Oregon True
# Texax True
# dtype: bool
print obj4.isnull() #Series的isnull方法
#输出结果如下:
# California True
# Ohio False
# Oregon False
# Texax False
# dtype: bool
(5)Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。
print obj3,obj4
# Ohio 35000
# Oregon 16000
# Texax 71000
# Utah 5000
# dtype: int64
#
# California NaN
# Ohio 35000.0
# Oregon 16000.0
# Texax 71000.0
# dtype: float64
print obj3+obj4
# California NaN
# Ohio 70000.0
# Oregon 32000.0
# Texax 142000.0
# Utah NaN
# dtype: float64
(6)Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切
obj4.name='population'
obj4.index.name='state'
print obj4
#输出如下:加上state和name
# state
# California NaN
# Ohio 35000.0
# Oregon 16000.0
# Texax 71000.0
# Name: population, dtype: float64
(7)Series的索引可以通过赋值的方式就地修改
obj2.index=['Bob','Steven','Jeff','Ryan']
print obj2
#输出结果如下:
# Bob 4
# Steven 7
# Jeff -5
# Ryan 3
# dtype: int64
obj2['Bob']=15
print obj2
#输出结果如下:
# Bob 15
# Steven 7
# Jeff -5
# Ryan 3
# dtype: int64
print obj2['Bob'].values #没有这种表示法,报错。因为类似字典取值,直接取键值即可
print obj2.values #查看所有值
3. DataFrame相当于有表格,有行表头和列表头
a=pd.DataFrame(np.random.rand(4,5),index=list("ABCD"),columns=list('abcde')) print a
4.DataFrame的一些操作
#增加列或修改列 a['f']=[1,2,3,4] a['e']=10 print a print "=======================" #增加行或修改行 a.ix['D']=10 # print a S=pd.DataFrame(np.random.rand(4,6),index=list('EFGH'),columns=list('abcdef')) a=a.append(S) print a print "=======================" #切片 print (a[['b','e']]) #取'b','e'列 print a.loc['A':'D',['a','c','f']] #取'A'-'D'行'a','c','f'列 print "=======================" #减少行或减少列 a=a.drop(['C','D']) #删除'C'行和'D' print a a=a.drop('a',axis=1) #删除'a'列,axis=0表示行,axis=1表示列 print a print "=======================" #缺省值处理 a.iloc[2,3]=None #取第三行第4列值设为None a.iloc[4,0]=None #取第五行第1列值设为None print a a=a.fillna(5) #缺省值处(即NaN处填充为5) print a #缺省值去行即有缺省值的把这一行都去掉 a.iloc[2,3]=None a.iloc[4,0]=None print a a=a.dropna() #删除缺省值为NaN的行 print a print "=======================" #读取excel,适当改动后,保存到excel中 e1=pd.read_excel('test.xlsx',sheetname='Sheet1') e1.columns=['class','no','name','sex','dormitory','phonenumber'] print(e1) print(e1.ix[2]) print(e1['class']) print(e1.sex) #可将取出的数据处理,处理完后再保存到excel中去 e2=pd.read_excel('test_copy.xlsx',sheetname='Sheet1',names='table1',header=None) e2.columns=['a','b','c','d'] print(e2) e2.to_excel('test_write.xlsx',header=False,index=False)
(1)构建DataFrame 的方法很多,最常用的一种是直接传入一个由等长列表或者Numpy数组组成的字典
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
from numpy.linalg import inv,qr
from pandas import Series,DataFrame
import pandas as pd
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)
print frame
#输出的结果如下:
# 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
(2)如果指定了列序列,则DataFrame的列就会按照指定的顺序进行排序
frame1=DataFrame(data,columns=['year','state','pop'])
print frame1
#输出的结果如下:
# 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
(3)跟Series一样,如果传入的列在数据中找不到,就会产生NA值
frame2=DataFrame(data,columns=['year','state','pop','debt'],
index=['one','two','three','four','five']) #column列的索引,index是行的索引
print 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
print frame2.columns #输出列的索引
#输出结果如下:
# Index([u'year', u'state', u'pop', u'debt'], dtype='object')
(4)类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series.
print frame2['state'] #取出列索引为state的列的数据
#输出结果如下:
# one Ohio
# two Ohio
# three Ohio
# four Nevada
# five Nevada
# Name: state, dtype: object
print frame2.year
#输出结果如下:
# one 2000
# two 2001
# three 2002
# four 2001
# five 2002
# Name: year, dtype: int64
(5)返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取
比如用索引字段ix,ix是取行的索引
print frame2.ix['three']
#输出的结果如下:
# year 2002
# state Ohio
# pop 3.6
# debt NaN
# Name: three, dtype: object
(6)可以通过赋值的方式进行修改。
# frame2['debt']=16.5 #debt列全为16.5
# print 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']=np.arange(5.)
print 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
#赋值一个Series
val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt']=val
print frame2
#输出结果如下:不在index中的索引的值都赋了Nan
# 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
#为不存在的列赋值会创建出一个新列。关键字del用于删除列。
frame2['eastern']=frame2.state=='Ohio' #没有eastern列,固会自动增加一列
#frame2.state=='Ohio'如果等于则返回True,否则返回False
print 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 frame2['eastern'] #删除eastern列
print 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
print frame2.columns #查看frame2的列
#输出结果如下:Index([u'year', u'state', u'pop', u'debt'], dtype='object')
(7)另一种常见的数据形式是嵌套字典(也就是字典的字典)
pop={'Nevada':{2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3=DataFrame(pop)
print frame3
#输出的结果如下:
# Nevada Ohio
# 2000 NaN 1.5
# 2001 2.4 1.7
# 2002 2.9 3.6
#可以对frame进行转置
print frame3.T
#输出结果如下:
# 2000 2001 2002
# Nevada NaN 2.4 2.9
# Ohio 1.5 1.7 3.6
print DataFrame(pop,index=[2001,2002,2003])
#输出结果如下:
# Nevada Ohio
# 2001 2.4 1.7
# 2002 2.9 3.6
# 2003 NaN NaN
pdata={'Ohio':frame3['Ohio'][:-1],
'Nevada':frame3['Nevada'][:2]}
print DataFrame(pdata)
#输出结果如下:
# Nevada Ohio
# 2000 NaN 1.5
# 2001 2.4 1.7
二维ndarray 数据矩阵,还可以传入行标和列标
由数组、列表或元组组成的字典 每个序列会变成DataFrame的一列,所有序列的长度必须相同
Numpy的结构化/记录数组 类似于“由数组组成的字典”
由Series组成的字典 每个Series会成为一列。如果没显式指定索引,由各Series的索引会被合
并成结果的行索引
由字典组成的字典 各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”
的情况一样
字典或Series的列表 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame
的列标
由列表或元组组成的列表 类似于“二维ndarray”
另一个DataFrame 该DataFrame的索引将会被沿用,除非显式指定了其它索引
Numpy的MaskedArray 类似于"二维ndarray"的情况,只是掩码值在结果DataFrame会变成NA/缺失值
#如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来:
frame3.index.name='year';
frame3.columns.name='state'
print frame3
#输出结果如下:
# state Nevada Ohio
# year
# 2000 NaN 1.5
# 2001 2.4 1.7
# 2002 2.9 3.6
#跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据:
print frame3.values
# [[ nan 1.5]
# [ 2.4 1.7]
# [ 2.9 3.6]]
#如果DataFrame各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数据类型
print frame2.values
# [[2000 'Ohio' 1.5 nan]
# [2001 'Ohio' 1.7 -1.2]
# [2002 'Ohio' 3.6 nan]
# [2001 'Nevada' 2.4 -1.5]
# [2002 'Nevada' 2.9 -1.7]]