dataframe 空值替换为0_dataframe取元素方法总结

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'])

ec76409f273b64b0f0515c4006c58bca.png

例子里面行名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行

44a6e3f73d58cefb07dbcda1e7506458.png

注意:只取一行的话,要用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目前已经被弃用,就不赘述了。

12d6a41a616cba77055e275d62cc41fe.png

6)使用iat和at(不推荐)

iat和at只能去单个元素,iat使用索引,at使用行列名,但是其功能被iloc和loc包含,因此不推荐。

总结下来就是:(重点!!!!)

  1. 推荐使用iloc和loc,其他方式均不推荐。
  2. 取行可以不提列,取列必须提行。
  3. 可以用一个数字,一个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的行。

c2d180fa8a3d56ce21a889733447a144.png

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。

c86005aca276822851b59f8cb79b183e.png

df.loc['row1',df.loc['row1',:]==1]=99, 把第一行中的包含1的元素替换成99。

9de095715292a43929d3f09f344bc095.png

本质上原理和第二节和第三节加粗部分叙述的原理相同。

五. 按条件替换整个矩阵某些元素的值

原理:对于整个df进行判断,例如df>4代表一个True和False的矩阵。

cdd79cbfc3fd16330bd678439e564ab1.png

然后df[df>4]=100,会把所有True对应的元素替换成100,于是df变成

05ca4d25acc5ff8dc7569178c341d0e5.png

版权声明:本文为weixin_42350101原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。