dataframe是pandas包的重要对象,熟练掌握dataframe的基本操作是很有必要的。
下面就总结一下dataframe取行列元素的基本操作。
一. DataFrame的基本结构
可以理解为一个矩阵,所有的行名保存在index, 列名保存在columns(注意:一个是单数,一个是复数)。写程序的时候不仅要调用pandas (import pandas as pd), 还要记得调用numpy这个包:(import numpy as np), pandas不默认包含numpy。
构建一个3×3的dataframe如下:
df = pd.DataFrame(np.arange(9).reshape(3, 3), index = ['row1', 'row2', 'row3'], columns=['col1', 'col2','col3'])
例子里面行名df.index=Index(['row1','row2','row3'],dtype='object')
以及df.columns=Index(['col1','col2','col3'],dtype='object')。(Index对象用来保存标签数据)。
二. 按索引或行列名选取DataFrame的行和列的方法
1)用列名取一列 (不推荐)
df['col1']即取得第一列,是一个Series对象。
注意:用df['row1'],df[0],df[:,0],df[0,:]统统都会报错的,这类命令只能用来按列名取一列。(ugly的设计!)
2)按行号取行(不推荐)
df[0:2]代表取得第0行和第1行
注意:只取一行的话,要用df[0:1],不能用df[0]。(ugly的设计!)
3)使用iloc按行号列号来取(推荐)
取一行:df.iloc[0]或df.iloc[0,:]
取多行:df.iloc[[0,2]]或df.iloc[[0,2],:]
取连续多行:df.iloc[0:2]或df.iloc[0:2,:]
取一列:df.iloc[:,0]
取多列:df.iloc[:,[0,2]]或df.iloc[:,[0,2]]
取连续多列:df.iloc[:,0:2]
注意:
- 取行的时候可以不提列,也可以用",:"来指全列。
- 取列的时候必须用":,"来指定全行。
- 可以使用一个数字来代表一个,可以使用一个list [a,b]代表多个,也可以使用a:b代表连续多个。
4)使用loc按行名列名来取(推荐)
取一行:df.loc['row1']或df.loc['row1',:]
取多行:df.loc[['row1','row2']]或df.loc[['row1','row2'],:]
取连续多行:df.loc['row1':'row2']或df.loc['row1':'row2',:]
取一列:df.loc[:,'col1']
取多列:df.loc[:,['row1','row2']]
取连续多列:df.loc[:,'row1':'row2']
注意:
- 取行的时候可以不提列,也可以用",:"来指全列。
- 取列的时候必须用":,"来指定全行。
- 可以使用一个数字来代表一个,可以使用一个list ['a','b']代表多个,也可以使用'a':'b'代表连续多个。
5)使用ix(不推荐)
ix的使用方法和iloc类似,可以既使用数字索引,也可以使用行名列名索引。ix目前已经被弃用,就不赘述了。
6)使用iat和at(不推荐)
iat和at只能去单个元素,iat使用索引,at使用行列名,但是其功能被iloc和loc包含,因此不推荐。
总结下来就是:(重点!!!!)
- 推荐使用iloc和loc,其他方式均不推荐。
- 取行可以不提列,取列必须提行。
- 可以用一个数字,一个list,或者一个区间来取行列。
三. 按条件选取DataFrame的行和列
选取行的原理就是:
df.loc[一个由True和False组成的Series]=只包括True对应的行的子矩阵。
选取列的原理就是:
df.loc[:,一个由True和False组成的Series] = 只包括False对应的列的子矩阵。
(注意不可以使用iloc)
例如:df.loc[df['col1']==3],就是取出第一列,凡是对应数字为3的给True,不为3的给False,然后去所有为True的行。
df.loc[~(df['col1'!=3)] 同上。
而本质上如下命令也可以取得同样的效果:
df.loc[df.loc[:,'col1']==3,:],
df.loc[df.iloc[:,0]==3,:]。
例如:df.loc[:,df.loc['row1']==1] 就是取出第一行,凡是对应数字为1的给True,不为1的给False, 然后取所有为True的列。
四. 按条件替换Dataframe某一列或行的值
df.loc[df['col1']==3,'col1']=99, 把第一列中的包含3的元素替换成99。
df.loc['row1',df.loc['row1',:]==1]=99, 把第一行中的包含1的元素替换成99。
本质上原理和第二节和第三节加粗部分叙述的原理相同。
五. 按条件替换整个矩阵某些元素的值
原理:对于整个df进行判断,例如df>4代表一个True和False的矩阵。
然后df[df>4]=100,会把所有True对应的元素替换成100,于是df变成