Pandas 删除数据

1. 前言

上一小节我们讲述了如何新增数据的方法,主要包括新增行和列的具体操作,新增操作是为了我们对数据进行扩充,满足我们对数据量大和内容丰富的追求,而有时候恰恰相反,数据里面存在大量的脏数据和无效数据,我们需要对这部分数据进行删除,避免这些数据在分析结果中带来的误差或精度不够的影响,那在 Pandas 中该如何根据需要去删除指定的数据集呢?

Pandas 删除数据可以分为两种操作,一是删除指定的行或列,二是根据条件删除某些特定数据的行或列。这两者虽然在效果上都能有效的删除我们不需要的数据,但其操作的本质是不一样的,那我们接下来就具体看一下这两种操作的细节内容吧。

2. 删除指定行或列

这里删除指定的行或列,我们主要用到了 Pandas 提供的一个函数 drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’) ,该函数提供了七个参数,为我们删除指定的行或者列提供了便捷的操作,下面我们列举了该函数常用参数的说明:

参数名 说明
labels 标签(行标签或者列标签)
axis 表示删除行(axis=0 默认)或者删除列(axis=1)
index 删除的行索引名
columns 删除的列索引名
inplace 指定删除是否要在原数据上进行操作,默认是 False

2.1 删除指定的行

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
  编程语言   推出时间    价格                       主要创始人
0    java  199545.6               James Gosling
1  python  199167.0            Guido van Rossum
2       C  197233.9  Dennis MacAlistair Ritchie
3      js  199559.5                Brendan Eich
4     php  201269.9              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

# 删除指定行 等价于drop(labels=[0,1],axis=0)
data_res=data.drop(labels=[1,3])
print(data_res)
print(data)

# --- 输出结果 ---
# --- data_res的数据集 ---
    编程语言   推出时间    价格                       主要创始人
0  java  199545.6               James Gosling
2     C  197233.9  Dennis MacAlistair Ritchie
4   php  201269.9              Rasmus Lerdorf
5   C++  198375.0           Bjarne Stroustrup
# --- data的数据集 ----
     编程语言   推出时间    价格                       主要创始人
0    java  199545.6               James Gosling
1  python  199167.0            Guido van Rossum
2       C  197233.9  Dennis MacAlistair Ritchie
3      js  199559.5                Brendan Eich
4     php  201269.9              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

输出解析:我们通过 drop() 方法的 labels 设置了标签为 1 和 3,默认是 axis=0 则对应的是删除行索引为 1 和 3 的行数据,如果 axis=0 是删除行数据而设置的 labels 对应的不是行索引标签,则删除时会报错,这里可以看到输出结果正是删除了行索引为1和3的两行数据。

这里值得注意的是:在执行删除操作后我们再次打印了原 data 数据集,通过输出可以看到,data 的数据并没有被影响到,还是完整的数据集。这里如果我们的 inplace 参数设置了 True,则对应的删除操作后,原数据就会被修改,通过下面的代码可以看到操作效果:

# 删除指定行 等价于drop(labels=[0,1],axis=0)
data_res=data.drop(labels=[1,3],axis=0,inplace=True )
print(data_res)
print(data)

# --- 输出结果 ---
None

   编程语言   推出时间    价格                       主要创始人
0  java  199545.6               James Gosling
2     C  197233.9  Dennis MacAlistair Ritchie
4   php  201269.9              Rasmus Lerdorf
5   C++  198375.0           Bjarne Stroustrup

输出解析:这里可以看到 data_res 的输出结果为 None ,而 data 原数据集则被删除了1和3的索引行。这是因为当我们设置了 inplace=True 时,drop() 操作后就不会返回一个新的数据集,而是在原数据集的基础上进行了操作,在实际应用中,如果不是特别的需要,建议不要指定该参数为 True,不然会改变原有数据对其他的分析产生一定的影响。

2.2 删除指定的列

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
  编程语言   推出时间    价格                       主要创始人
0    java  199545.6               James Gosling
1  python  199167.0            Guido van Rossum
2       C  197233.9  Dennis MacAlistair Ritchie
3      js  199559.5                Brendan Eich
4     php  201269.9              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

# 删除指定列
data_res=data.drop(labels=["推出时间","主要创始人"],axis=1)
print(data_res)

# --- 输出结果 ---
     编程语言    价格
0    java  45.6
1  python  67.0
2       C  33.9
3      js  59.5
4     php  69.9
5     C++  75.0

输出解析:通过 labels 设置删除指定的列,列索引名要真实存在,不然会报错,同时 axis=1 是指定删除列操作,不能省略。通过输出结果可以看到删除了推出时间和主要创始人这两列的数据。

2.3 删除指定的行和列

有时候我们需要将某行和某列同时删除,这时候我们可以同时传入 index 和 columns 的参数值即可,如果只传一个,则是只删除对应的行或者列:

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
     编程语言   推出时间    价格                       主要创始人
0    java  199545.6               James Gosling
1  python  199167.0            Guido van Rossum
2       C  197233.9  Dennis MacAlistair Ritchie
3      js  199559.5                Brendan Eich
4     php  201269.9              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

# 同时删除指定行和列
data_res=data.drop(index=4, columns="主要创始人")
print(data_res)

# --- 输出结果 ---
  编程语言   推出时间    价格
0    java  199545.6
1  python  199167.0
2       C  197233.9
3      js  199559.5
5     C++  198375.0

输出解析:这里我们同时指定了行索引和列索引的值,通过输出结果可以看出,这里删除了行索引为4的数据并且删除了主要创始人这一列的数据。

3. 删除特定数据的行

这里我们讲的删除特定数据的行或列,其实并不是真正意义上的删除内容,而是通过数据条件的筛选过滤,得到一个新的数据集,从效果上看,也是去除了部分数据内容,达到了我们删除数据的实际需要。

# 导入pandas包
import pandas as pd
# 指定导入的文件地址
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)

# --- 输出结果 ---
  编程语言   推出时间    价格                       主要创始人
0    java  199545.6               James Gosling
1  python  199167.0            Guido van Rossum
2       C  197233.9  Dennis MacAlistair Ritchie
3      js  199559.5                Brendan Eich
4     php  201269.9              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

# 我们对价格列小于50的数据进行筛选
data_res=data[data["价格"]<50]
print(data_res)

# --- 输出结果 ---
 编程语言   推出时间    价格            主要创始人
0  java  199545.6               James Gosling
2     C  197233.9  Dennis MacAlistair Ritchie

输出解析:这里我们通过对价格列费用小于50的数据进行筛选,进而删除掉了价格大于等于50的数据行,返回给了新的数据集 data_res ,在效果上达到了删除数据行的作用。

3.小结

本节课我们主要学习了删除数据行或者列的操作方法,一种是通过 drop() 方法删除指定的行或列,二是通过数据的筛选过滤进而达到删除数据行的效果,两种删除方法要根据具体的业务需要进行选用。本节课程的重点如下:

  • drop() 操作删除数据行和列的操作方法;
  • drop() 操作中几个重要参数的使用;
  • 根据特定条件删除数据行的操作。

图片描述

Tips:想要学习更多Pandas相关知识,可以点击
Pandas 新增数据
Pandas 修改数据
Pandas 查询数据