跳到主要内容

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() 操作中几个重要参数的使用;
  • 根据特定条件删除数据行的操作。

图片描述