pandas常用操作复习-04-删除行列


目录
  • 前情提要
  • 数据准备
  • 实际操作
    • 导入模块
    • 指定文件
    • 读取文件并查看
    • 创建副本以供操作
    • 删除
        • 利用pop
        • 利用drop
          • 删除列:
          • 删除行
        • 利用dropna()
  • 致谢链接

前情提要

??在上一节的移动列的位置一节中,我们使用了一种常用的方法:首先利用一个中间变量,将要更动位置的列赋值给它,再使用pandas中的insert()将这个中间变量插入到合适的位置。

??我们用到了pop(),所谓pop,就是弹出的意思。将一个列弹出,那么原数据中当然也就没有这个列的内容了。因此pop()也可以说是删除。而且是原地删除

??因此特意腾出一节来说明pandas中的删除操作

数据准备

??因为是专门介绍删除操作,所以我们额外补充了一点数据。

学号 姓名 班级 语文 数学 英语 音乐 美术 体育 等级
0 A01 饶秀颖 1班 35.0 45.0 55.0 95.0 95.0 95.0 A
1 A02 于俊远 1班 38.0 53.0 46.0 97.0 98.0 95.0 A
2 A03 王五 1班 54.0 46.0 38.0 97.0 99.0 97.0 A
3 A08 冉颇 3班 34.0 54.0 60.0 96.0 98.0 99.0 A
4 A09 夫余岚裳 3班 43.0 57.0 67.0 98.0 95.0 94.0 A
5 A10 薛菁 3班 55.0 60.0 65.0 96.0 93.0 96.0 A
6 A11 印采绿 NaN 12.0 10.0 7.0 90.0 90.0 90.0 A

??如果仔细观察,会发现多了一行一列一行是一个班级位置为NaN的学生,一列是全部为A的等级列。

  • 现在因为双减,很多地方不算排名,只给予等级,学校的老师为了安家长的心给的都是等级A,何老师可看不惯这种,现在他要做的就是将这一列等级列删除。

  • 此外多出的一行,原来是明年要转走的学生,现在他也要将之删除掉。

实际操作

导入模块

import pandas as pd
import pathlib

指定文件

file_path = pathlib.Path("/content/drive/MyDrive/Notebooks_data/delete.xlsx")
file_path

out

PosixPath('/content/drive/MyDrive/Notebooks_data/delete.xlsx')

读取文件并查看

data_source = pd.read_excel(file_path)
data_source

out

学号 姓名 班级 语文 数学 英语 音乐 美术 体育 等级
0 A01 饶秀颖 1班 35.0 45.0 55.0 95.0 95.0 95.0 A
1 A02 于俊远 1班 38.0 53.0 46.0 97.0 98.0 95.0 A
2 A03 王五 1班 54.0 46.0 38.0 97.0 99.0 97.0 A
3 A08 冉颇 3班 34.0 54.0 60.0 96.0 98.0 99.0 A
4 A09 夫余岚裳 3班 43.0 57.0 67.0 98.0 95.0 94.0 A
5 A10 薛菁 3班 55.0 60.0 65.0 96.0 93.0 96.0 A
6 A11 印采绿 NaN 12.0 10.0 7.0 90.0 90.0 90.0 A

创建副本以供操作

# .copy(deep=True)是深度拷贝。这样针对任意一个data的操作,都不会影响到其他的data
data1 = data_source.copy(deep=True)
data2 = data_source.copy(deep=True)
data3 = data_source.copy(deep=True)
data4 = data_source.copy(deep=True)

删除

利用pop

# 利用pop语法可以原地删除数据,操作以后原始数据的内容直接被更改
# 但是需要注意的是:pop只能处理列的删除问题
data1.pop("等级")
data1

out

学号 姓名 班级 语文 数学 英语 音乐 美术 体育
0 A01 饶秀颖 1班 35.0 45.0 55.0 95.0 95.0 95.0
1 A02 于俊远 1班 38.0 53.0 46.0 97.0 98.0 95.0
2 A03 王五 1班 54.0 46.0 38.0 97.0 99.0 97.0
3 A08 冉颇 3班 34.0 54.0 60.0 96.0 98.0 99.0
4 A09 夫余岚裳 3班 43.0 57.0 67.0 98.0 95.0 94.0
5 A10 薛菁 3班 55.0 60.0 65.0 96.0 93.0 96.0
6 A11 印采绿 NaN 12.0 10.0 7.0 90.0 90.0 90.0

利用drop

drop()的删除操作多样,可以删除行也可以删除列。drop()是流行的对pandas DataFrame进行删除的操作。

但需要注意的是,drop如果没有指定inplace=True, 那么就不是原地进行删除操作

删除列:
# 法一:利用.drop(columns="列名")
# 倘若要一次性删除多个列,则可以使用列表:.drop(columns=["列1", "列2"])
data2.drop(columns="等级")
# 法二:利用.drop(labels="列名", axis=1)
# 同样的,倘若要一次性删除多个列,则可以使用列表:.drop(labels=["列1", "列2"], axis=1)
data2.drop(labels="等级", axis=1)

上述两种代码都可以得到相同的结果

学号 姓名 班级 语文 数学 英语 音乐 美术 体育
0 A01 饶秀颖 1班 35.0 45.0 55.0 95.0 95.0 95.0
1 A02 于俊远 1班 38.0 53.0 46.0 97.0 98.0 95.0
2 A03 王五 1班 54.0 46.0 38.0 97.0 99.0 97.0
3 A08 冉颇 3班 34.0 54.0 60.0 96.0 98.0 99.0
4 A09 夫余岚裳 3班 43.0 57.0 67.0 98.0 95.0 94.0
5 A10 薛菁 3班 55.0 60.0 65.0 96.0 93.0 96.0
6 A11 印采绿 NaN 12.0 10.0 7.0 90.0 90.0 90.0
删除行

不同于删除列的时候有列名,一般不会自定义行标签。

因此删除行其实可以分成两类。

一个是按照顺序的索引来删除。但是这往往只适合少量已知位置的数据。

二是判定条件,如果符合条件就删除所在的一行。

判定条件我们常使用dropna()

# 法一:利用.drop(index=行号)
data3.drop(index=6)
# 法二:利用.drop(index=行标签, axis=0)
# 但是因为一般并不人为规定行标签,故而同index一样,这里也使用的行号
data3.drop(labels=6,axis=0)

out

学号 姓名 班级 语文 数学 英语 音乐 美术 体育 等级
0 A01 饶秀颖 1班 35.0 45.0 55.0 95.0 95.0 95.0 A
1 A02 于俊远 1班 38.0 53.0 46.0 97.0 98.0 95.0 A
2 A03 王五 1班 54.0 46.0 38.0 97.0 99.0 97.0 A
3 A08 冉颇 3班 34.0 54.0 60.0 96.0 98.0 99.0 A
4 A09 夫余岚裳 3班 43.0 57.0 67.0 98.0 95.0 94.0 A
5 A10 薛菁 3班 55.0 60.0 65.0 96.0 93.0 96.0 A

利用dropna()

我们观察数据发现,我们要删除的那一行是有一个显眼的条件的:其班级位置出为空值,显示在pandas中就是NaN。
我们利用dropna()方法,指定删除行axis=0,指定只要有空值就删除how="any", 然后指定在哪些列中进行搜索subset=[]列表内可以是多个columns

data4.dropna(axis=0, how="any", subset=["班级"])

out

学号 姓名 班级 语文 数学 英语 音乐 美术 体育 等级
0 A01 饶秀颖 1班 35.0 45.0 55.0 95.0 95.0 95.0 A
1 A02 于俊远 1班 38.0 53.0 46.0 97.0 98.0 95.0 A
2 A03 王五 1班 54.0 46.0 38.0 97.0 99.0 97.0 A
3 A08 冉颇 3班 34.0 54.0 60.0 96.0 98.0 99.0 A
4 A09 夫余岚裳 3班 43.0 57.0 67.0 98.0 95.0 94.0 A
5 A10 薛菁 3班 55.0 60.0 65.0 96.0 93.0 96.0 A

致谢链接

DataFrame的copy的用法_dataframe 复制

Python Pandas Dataframe.pop()用法及代码示例

*Pandas: Drop函数(Dataframe删除指定行列)

*pandas检查是否有空值以及处理空值