读书笔记一、pandas数据结构介绍
pandas数据结构介绍
主要两种数据结构:Series和DataFrame.
Series
Series是一种类似于一维数组的对象,由一组数据(各种NumPy数据类型)+数据标签(即索引)组成。
#直接传入一组数据 from pandas import Series,DataFrame obj=Series([4,2,3]) obj #Series的values和index属性获取数组表示形式和索引对象 obj.values obj.index
Series字符串的表现形式:索引在左,值在右边。
不为数据指定索引,自动创建一个0~N-1的整数型索引。
Series的index和values的元素之间虽然存在对应关系,但是与字典的映射不同。index和values实际上仍为互相独立的ndarray数组.
#创建一个对各个数据点进行标记索引的Series obj2=Series([4,2,3],index=['a','b','c']) obj2 obj2.index #通过索引的方式选取Series中的单个或者一组值 obj2['a'] obj2[['a','c','b']] obj2['d']=6 #对数组进行运算保留索引和值之间的关系 obj2 obj2+obj2 obj2[obj2>2] obj2*2 #将Series看成一个定长的有序字典,它是索引值到数据值的一个映射 'b' in obj2 'e' in obj2 #通过字典来创建Series #只传入一个字典,则结果Series中的索引就是原字典中的键。 sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000} obj3=Series(sdata) obj3
states=['California','Ohio','Oregon','Texas'] obj4=Series(sdata,index=states) obj4
sdata中和states索引相匹配的三个值会被找出来并放到相应的位置上,找不到“California"对应的sdata值,其结果就为NaN。在pandas中,NaN用于表示缺失或NA值。
#pandas的isnull函数、notnull函数用于检测缺失数据 pd.isnull(obj4) pd.notnull(obj4) #Series也有类似的实例方法 obj4.isnull()
Series最重要的一个功能:在算术运算中会自动对齐不同索引的数据。(换句话说就是Series在进行算术运算时,index会自动对齐)
obj3 obj4 obj3+obj4 #会发现'California'和'Utah'索引对应的数据值是NaN #name属性 #Series本身以及其索引都有name属性 obj4.name='population' obj4.index.name='state' obj4 #通过赋值的方式就地修改Series的索引 obj.index=['Bob','Steve','Jeff'] obj
DataFrame
DataFrame是一个表格型数据结构,含有一组有序的列,每列可以是不同的值的类型。基本上可以把DataFrame看成一个共享同一个index的Series的集合。
DataFrame的构造方法与Series类似,只不过同时接受一条一维数据源,每一条都会成为单独的一列。
创建DataFrame
最常用的是直接传入一个由等长列表或NumPy数组组成的字典。
data={'state':['Ohino','Ohino','Ohino','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002], 'pop':[1.5,1.7,3.6,2.4,2.9]} df=DataFrame(data) df
结果会自动加上索引,且全部列会被有序排列。
虽然参数data看起来是个字典,但是字典的键并非充当DataFrame的index的角色,而是Series的“name”属性。
#构造较为完整的DataFrame的参数: DataFrame(data=None,index=None,columns=None) #columns即“name”
如果指定了列序列,则DataFrame的列会按照指定顺序进行排列:
DataFrame(data,columns=['year','state','pop']) #如果传入的列找不到,就会产生NA值 df=DataFrame(data,index=['one','two','three','four','fiva'], columns=['year','state','pop','debt'])
缺失值由NaN补上。
df.index df.columns type(df['debt'])
DataFrame 面向行和面向列的操作基本上是平衡的,任意抽出一列都是Series。
将DataFrame的列获取为一个Series
#两者等价 df['state'] df.state
注意,返回的Series拥有原DataFrame 相同的索引,且其name属性也已经被相应地设置好。
获取行
行也可以使用位置或名称的方式进行获取,使用索引字段ix
df.ix['three']
列可以通过赋值的方式进行修改。
#对空列进行赋值 df['debt']=16.5 df['debt']=np.arange(5.)
将列表或数组进行赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的时一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值:
val=Series([-1.2,-1.5,-1.7],index=['two','four','fiva']) df['debt']=val df
为不存在的列赋值会创建出一个新列。关键字del用于删除列:
df['eastern']=df.state=='Ohino' del df['eastern'] df.columns
另一种常见的数据形式是嵌套字典,将其传给DataFrame,被解释为:外层字典的键作为列,内层字典的键作为索引(也可以显示指定索引)
pop={'Nevada':{2001:2.4,2002:2.9}, 'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame=pd.DataFrame(pop)
#对frame进行转置,内层字典的键会被合并、排序以形成最终的索引 frame.T
#显示指定索引 DataFrame(pop,index=[2001,2002,2003]) #由Series组成的字典 pdata={'Ohio':frame3['Ohio'][:-1], 'Nevada':frame3['Nevada'][:2]} #设置DataFrame的index和columns的name属性,也会显示出来 frame3.index.name='year' frame3.columns.name='state'
和Series一样,values属性也会以二维ndarray的形式分返回DataFrame中的数据:
frame3.values