不得不说DataFrame如今很火,已经有不少库都是基于DataFrame写的,并且它用起来也很方便,读excel只须要一行代码,起使用xlrd的日子,至今还脑袋疼,因此对于一个用python作数据处理的人来讲,pandas是必需要了解的。对于一个数据处理工具来讲,读写是最基本的,下面是我最近整理的关于pandas一些基本本操做,主要包括如下内容:html
开始前先引入两个库python
import pandas as pd import numpy as np
data={"one":np.random.randn(4),"two":np.linspace(1,4,4),"three":['zhangsan','李四',999,0.1]} df=pd.DataFrame(data,index=[1,2,3,4])
set_index
、reset_index
、reindex
。set _index
用于将df中的一行或多行设置为索引。df.set_index(['one'],drop=False)
ordf.set_index('one)
df.set_index(['one','two'])
df.index=['a','b','c','d']
reset_index
用于将索引还原成默认值,即从0开始步长为1的数组。df.reset_index(drop=True)
drop
默认值为False
,意为将原来的索引作为数据列保留,若是设为True
,原来的索引会直接删除。reindex
比较复杂,也不经常使用到,这里是基础篇,不作大量说明,感兴趣的朋友能够看官方文档data=np.random.randn(6,4)#建立一个6行4列的数组 df=pd.DataFrame(data,columns=list('ABCD'),index=[1,2,'a','b','2006-10-1','第六行'])
pd.DataFrame(columns=('id','name','grade','class'))
为了便于理解,如下面DataFrame为例,对其读写操做展开说明:
web
方法1:df.列名
该方法每次只能读取一列。
方法2:df['列名']
or df[['列名']]
、df[['列名1','列名2','列名n']]
ps:df['A']
和 df[['A']]
都能读取第一列数据,但它们的返回结果是不一样的,这里的不一样指的是数据结构的不一样,感兴趣的朋友能够用type(df['A']),type(df[['A']])
查看。
方法3 .iloc[:,colNo]
or .iloc[:,colNo1:colNo2]
按列号读取,有时候咱们可能更但愿经过列号(1,2,3…)读取数据而不是列名,又或着咱们要读取多行的时候一个一个输入列名是很麻烦的,咱们但愿有最简单的代码读取咱们最想要的内容,.iloc
方法可让咱们经过列号索引数据,具体以下:
df.iloc[:1]
读取第一列
df.iloc[:,1:3]
读取第1列到第3列
df.iloc[:,2:]
读取第2列以后的数据
df.iloc[:,:3]
读取前3列数据
ps:这实际上是按单元格读取数据的特殊写法,若是有疑问请看 2.3 按单元格读取数据。数组
方法1:.loc['行标签']
or.loc[['行标签']]
、.loc[['行标签1','行标签2','行标签n']]
.loc
根据行标签索引数据,这里的行标签能够理解为索引(没有深刻研究,可是在这里,行标签=索引),好比咱们要分别读取第1行和第3行就是df[[1]]
、df[['a']]
,若是该df的索引变为['a', 'b', 'c', 'd', 'e', 'f']
,分别读取第1行和第3行的操做将变成df[['a']]
,df[['c']]
,也就是说.loc
后面的'行标签'
必须在索引中。
ps:df.loc[[1]]
和df.loc[1]
返回结果的值相同,但数据结构有差别
方法2:.iloc['行号']
or.iloc[['行号']]
、.iloc[['行号1','行号2','行号n']]
.iloc
根据行号索引数据,行号是固定不变的,不受索引变化的影响,若是df的索引是默认值,则.loc和.iloc的用法没有区别,由于此时行号和行标签相同。
能够看到df.loc[1]
和df.iloc[1]
读到的内容是不同的,df.loc[1]
读取的是索引号为1的那一行,df.iloc[1]
读取的是第1行。
此外,.iloc
能够经过切片的方式读取数据,所谓切片就是给出要读数据的首尾位置,而后读取首尾中间这“一片”数据(我的理解,可能理解的不对或比较片面,对此有疑惑的朋友请自行查阅相关资料)好比咱们要读取第1行到第4行的数据,利用切片的方法就是df.iloc[1:5]
若是从第0行开始读,则首位置能够省略,若是从某一行读到末尾,则尾位置能够省略。
df.iloc[:5]
,读取第0行到第4行的数据;
df.iloc[8:]
,读取第8行后全部数据,包括第8行;
df.iloc[3,6]
,读取第3行到第6行的数据,包括第3行但不包括第6行。
方法3:.ix
根据其余网友的说法,.ix是.loc和.iloc的综合版,既能够经过行标签检索也能够根据行号检索。经过实验发现这个说法并不完成正确。以上面的df为例:
由于df.ix[[1]]
能够认为是要读第1行,也能够认为要读索引为1的那一行,此时就产生了冲突,能够看到此时pandas认为df.ix[[1]]
读的是索引为1的那一行,若是用索引外的标签检索就会报错,而df.ix[1]
被认为是第1行,此时df.ix[1]
和df.ix[[1]]
读到的不是同一行数据。
若是咱们将df的索引改成['a', 'b', 'c', 'd', 'e', 'f']
再进行上面的操做
此时df.ix[5]
和df.ix[[5]]
读到的是同一行数据。
经过以上实验,loc
,iloc
,ix
的区别以下:
loc
经过索引标签读取数据;
iloc
经过行号读取数据;
ix
既能够经过行号读取数据,也能够经过索引标签读取数据,可是当索引为数字且不从0开始时,有两种状况:
(1)每次读一行:经过索引标签读取和经过行号读取有不一样的写法.ix[['列标签']]
,.ix[行号]
。
(2)读取多行:此时只能经过索引标签,不能利用行号。
方法4:at
、iat
at
、iat
这里就不作介绍了,由于上面的方法彻底够用了,感兴趣的话能够看官方文档。
.loc
,.iloc
彻底能够知足DataFrame的读取操做,因此ix
,at
,iat
并不推荐使用。数据结构
方法1:df[col][row]
读取一个单元格的数据时推荐使用,也能够写成df.col[row]
方法2:.loc
(1)读取一个单元格:df.loc[row][col]
或df.loc[row,col]
(2)读取一行多列:app
df.loc[row][[col1,col2]]
df.loc[1,[col1,col2]]
df.loc[row][firstCol:endCol]
df.loc[row,firstCol:endCol]
df.loc[[row1,row2]][col]
df.loc[[row1,row2]].col
df.loc[[row1,row2],col]
df.loc[[row1,row2],[col1,col2]]
df.loc[[row1,row2]][[col1,col2]]
df.loc[[row1,row3],firstCol:endCol]
loc
不支持行号切片索引。.iloc
df.iloc[rowNo].col
df.iloc[rowNo][col]
df.iloc[rowNo,colNo]
df.iloc[rowNo,col]
不支持。df.iloc[rowNo,firestColNo,endColNo]
df.iloc[rowNo][[col1,col2]]
df.iloc[rowNo][firesCol:endCol]
df.iloc[rowNo,[col1,col2]]
,df.iloc[rowNo,firstColNo:endColNo]
均不支持。df.iloc[[rowNo1,rowNo2],colNo]
df.iloc[firstRowNo:endRowNo,colNo]
df.iloc[[rowNo1,rowNo2]][col]
df.iloc[firstRowNo,endRowNo][col]
df.iloc[firstRowNo:endRowNo,firstColNo:endColNo]
df.iloc[[RowNo1,RowNo2],[ColNo1,ColNo2]]
df.iloc[firstRowNo:endRowNo][[col1,col2]]
.ix
df.ix[firstRow/firstRowNo:endRow/endRowNo,firstCol/firstColNo:endCol/endColNo]
df.ix[[row1/rowNo1,row2,rowNo2],[col1/colNo1,col2,colNo2]]
at
,iat
df.col=colList/colValue
df[col]=colList/colValue
df.A=[1,2,3,4,5,6]
,df['A']=0
df.loc[row]=rowList
df.loc[row]=rowValue
df.loc[[row1,row2],[col1,col2]]=value/valueList
df.iloc[[rowNo1,rowNo2],[colNo1,colNo2]]=value/valueList
df.iloc[[rowNo1,rowNo2]][[col1,col2]]=value/valueList
df.ix[firstRow:endRow,firstCol:endCol]=value/valueList
ps:DataFrame的读写操做是多变的,这里也仅仅列出了几种经常使用的方法,熟练一种方式便可。dom
如下面DataFrame为例展开说明
svg
insert(ioc,column,value) ioc:要插入的位置 colunm:列名 value:值
row={'one':111,'two':222,'three':333} df.loc[1]=row or df.iloc[1]=row or df.ix[1]=row or
若是插入一行或一列,用上面的方法把插入位置改成末尾便可,下面给出插入多行多列的方法。函数
pandas.concat(objs, axis=0, join_axes=None, ignore_index=False) objs:合并对象 axis:合并方式,默认0表示按列合并,1表示按行合并 ignore_index:是否忽略索引
有df1和df2定义以下:
工具
利用append函数能够完成相同的操做:
drop(labels, axis=0, level=None, inplace=False) lables:要删除数据的标签 axis:0表示删除行,1表示删除列,默认0 inplace:是否在当前df中执行此操做
后记:关于pandas的基本操做就写到这里了,关于以上内容若是有什么问题能够经过邮件联系博主,水平有限,请你们批评指正。
后面若是有机会,我会写关于DataFrame更进一步的操做,我也不知道会不会写,能写多少,先附上地址pandas进阶:DataFrame高级操做