python--pandas删除操作

删除是数据清洗中的高频操作,本文基于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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值