删除是数据清洗中的高频操作,本文基于pandas,介绍其dataFrame的一些删除操作,包括了删除行,
删除列,删除缺失值,删除重复值。
环境
- python3.9
- win10 64bit
- pandas==1.2.1
本文介绍的方法中,均有
inplace
参数,其默认值都为False
,表示返回新数据框;设置为True
表示替换原数据框,返回None
删除行/列
drop
方法是pandas中删除行或列的方法。
# 准备数据
import pandas as pd
pd.set_option('display.notebook_repr_html',False)
df=pd.DataFrame(dict(x=range(5),y=range(2,7),z=range(4,9)),index=list('abcde'))
df
x y z
a 0 2 4
b 1 3 5
c 2 4 6
d 3 5 7
e 4 6 8
删除行
根据索引名
删除目标行。
# 删除单行
df.drop('a')
x y z
b 1 3 5
c 2 4 6
d 3 5 7
e 4 6 8
# 删除多行
df.drop(['a', 'c'])
x y z
b 1 3 5
d 3 5 7
e 4 6 8
当需要根据索引位置删除时,可以使用index
属性来组合完成。
# 删除指定位置行
df.drop(df.index[[1,3]])
x y z
a 0 2 4
c 2 4 6
e 4 6 8
删除列
根据列名
删除目标列,同时需要设置axis=1
或者columns
。
# 删除一列
df.drop('x',axis=1)
y z
a 2 4
b 3 5
c 4 6
d 5 7
e 6 8
# 删除多列
df.drop(['x','z'],axis=1)
y
a 2
b 3
c 4
d 5
e 6
当需要根据列位置删除时,可以使用columns
属性来组合完成。
# 删除指定位置列
df.drop(df.columns[[0,1]],axis=1)
z
a 4
b 5
c 6
d 7
e 8
删除列也可以用关键字del
实现,每次只能删除一列,且删除列后,原数据发生改变。
del df['x']
df
y z
a 2 4
b 3 5
c 4 6
d 5 7
e 6 8
同时删除行列
同时删除行和列,需要为行使用index
参数,为列使用columns
参数。
df.drop(index=['a','b'],columns='y')
z
c 6
d 7
e 8
多重索引
当数据框有多重索引时,删除行时,需要设置level
参数。
level=0
表示第一层索引,即最左边索引,以此类推。
# 多重索引数据框
mi=pd.MultiIndex.from_product([range(3),list('abc')],names=['id','label'])
mi_df=pd.DataFrame(dict(x=range(1,10),y=range(2,11)),index=mi)
mi_df
x y
id label
0 a 1 2
b 2 3
c 3 4
1 a 4 5
b 5 6
c 6 7
2 a 7 8
b 8 9
c 9 10
# 删除第一层索引中的元素
mi_df.drop(0,level=0)
x y
id label
1 a 4 5
b 5 6
c 6 7
2 a 7 8
b 8 9
c 9 10
# 删除第二层索引中的元素
mi_df.drop(['a','b'],level=1)
x y
id label
0 c 3 4
1 c 6 7
2 c 9 10
多重索引数据框同时删除行和列时,只能删除第一层索引和列。
# 删除第一层索引元素和列
mi_df.drop(index=[0,1],columns='x')
y
id label
2 a 8
b 9
c 10
# 删除位置索引和列
mi_df.drop(index=mi_df.index[:3],columns='x')
y
id label
1 a 5
b 6
c 7
2 a 8
b 9
c 10
删除缺失值
dropna
为删除缺失值的方法。
删除缺失行
默认会删除包含缺失值的所有行。
# 数据准备
r_df=pd.DataFrame(dict(x=[None,3,None,4],y=[None,5,None,5],z=[None,9,7,8]))
r_df
x y z
0 NaN NaN NaN
1 3.0 5.0 9.0
2 NaN NaN 7.0
3 4.0 5.0 8.0
# 删除包含缺失值的行
r_df.dropna()
x y z
1 3.0 5.0 9.0
3 4.0 5.0 8.0
可设置how
,thresh
,subset
参数控制删除的行为。
注意subset参数:当删除行时,需要设置为列标签,删除列时,需要设置为行标签
# 删除全部为缺失值的行
r_df.dropna(how='all')
x y z
1 3.0 5.0 9.0
2 NaN NaN 7.0
3 4.0 5.0 8.0
# 删除至少有2个缺失值的行
r_df.dropna(thresh=2)
x y z
1 3.0 5.0 9.0
3 4.0 5.0 8.0
# 根据指定的列删除包含缺失的行
r_df.dropna(subset=['z'])
x y z
1 3.0 5.0 9.0
2 NaN NaN 7.0
3 4.0 5.0 8.0
删除缺失列
设置参数axis=1
或者axis=columns
删除缺失列。
# 数据准备
c_df=pd.DataFrame(dict(x=[None,None,None],y=[1,None,None],z=[6,9,7,]))
c_df
x y z
0 None 1.0 6
1 None NaN 9
2 None NaN 7
# 删除包含缺失值的列
c_df.dropna(axis=1)
z
0 6
1 9
2 7
# 删除包含缺失值的列
c_df.dropna(axis='columns')
z
0 6
1 9
2 7
同样,可以设置how
,thresh
,subset
参数来控制删除缺失列的行为。
# 删除全部为缺失值的列
c_df.dropna(axis=1,how='all')
y z
0 1.0 6
1 NaN 9
2 NaN 7
# 删除至少有2个缺失值的列
c_df.dropna(axis=1,thresh=2)
z
0 6
1 9
2 7
# 根据指定的行删除包含缺失的列
c_df.dropna(axis=1,subset=[1])
z
0 6
1 9
2 7
删除重复值
删除重复值用drop_duplicates
方法实现。
# 数据准备
d_df=pd.DataFrame(dict(x=[5,5,3,4],y=[1,1,2,3],z=[6,6,7,6]))
d_df
x y z
0 5 1 6
1 5 1 6
2 3 2 7
3 4 3 6
# 删除重复行,保留第一个重复行
d_df.drop_duplicates()
x y z
0 5 1 6
2 3 2 7
3 4 3 6
# 删除重复行,保留最后一个重复行
d_df.drop_duplicates(keep='last')
x y z
1 5 1 6
2 3 2 7
3 4 3 6
设置subset
参数,根据列删除重复行。
# 根据z列,删除重复行
d_df.drop_duplicates(subset=['z'])
x y z
0 5 1 6
2 3 2 7
设置ignore_index=True
可以对删除重复行后的数据索引重排序。
# 重排序索引
d_df.drop_duplicates(ignore_index=True)
x y z
0 5 1 6
1 3 2 7
2 4 3 6