三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从Excel筛选到Pandas删除:用.drop()方法搞定你的数据清洗日常(新手友好版)

从Excel筛选到Pandas删除:用.drop()方法搞定你的数据清洗日常(新手友好版)

从Excel筛选到Pandas删除:用.drop()方法搞定你的数据清洗日常(新手友好版)

如果你是从Excel转向Python的数据分析新手,面对Pandas的数据清洗操作可能会感到有些陌生。但别担心,本文将带你从熟悉的Excel操作出发,逐步掌握Pandas中.drop()方法的使用技巧,让你在数据清洗时游刃有余。

1. Excel思维到Pandas思维的转换

在Excel中,我们习惯通过筛选后删除行或直接隐藏/删除列来清理数据。而在Pandas中,.drop()方法就是实现这些操作的利器。让我们通过几个常见场景来理解这种思维转换:

1.1 删除特定行:从Excel筛选到Pandas条件删除

在Excel中删除"姓名是张三"的行,通常的操作是:

  1. 对姓名列进行筛选
  2. 选中筛选出的行
  3. 右键删除

在Pandas中,这一操作可以简化为一行代码:

df = df.drop(df[df['name'] == '张三'].index)

让我们拆解这行代码的含义:

  • df['name'] == '张三':创建一个布尔Series,标记哪些行满足条件
  • df[df['name'] == '张三'].index:获取满足条件的行的索引
  • df.drop():根据索引删除这些行

提示:这里的.index很重要,它告诉Pandas要删除哪些行。如果不加.index,会得到一个布尔Series而不是行索引。

1.2 删除多列:从Excel列选择到Pandas批量删除

Excel中删除多列的操作是:

  1. 按住Ctrl选择多个列头
  2. 右键删除

Pandas中的等效操作更加简洁:

# 方法1:直接列出列名 df = df.drop(columns=['col1', 'col2']) # 方法2:使用列索引 df = df.drop(df.columns[[1, 3]], axis=1)

两种方法各有优势:

  • 方法1更直观,适合列名明确的情况
  • 方法2适合需要按位置批量删除列的场景

2. .drop()方法的核心参数详解

.drop()方法的强大之处在于它的灵活性,通过不同参数组合可以实现各种删除需求。让我们深入理解这些参数:

2.1 基本参数对比

参数作用常用值示例
labels指定要删除的行/列标签单个标签或列表df.drop([1,2])
axis指定删除行还是列0/'index'或1/'columns'df.drop('A', axis=1)
index指定要删除的行索引单个标签或列表df.drop(index=[1,2])
columns指定要删除的列名单个标签或列表df.drop(columns=['A','B'])
inplace是否原地修改True/Falsedf.drop('A', inplace=True)
errors处理无效标签的方式'raise'/'ignore'df.drop('X', errors='ignore')

2.2 inplace参数的陷阱

很多新手会遇到这样的困惑:"为什么我执行了删除操作,但打印df时数据没变化?"这通常是因为忽略了inplace参数:

# 错误示范:操作不会影响原DataFrame df.drop('A', axis=1) print(df) # 列'A'仍然存在 # 正确做法1:使用inplace=True df.drop('A', axis=1, inplace=True) # 正确做法2:重新赋值 df = df.drop('A', axis=1)

注意:inplace=True会直接修改原DataFrame,而不会返回新对象。大多数情况下,建议使用重新赋值的方式,代码更清晰且易于调试。

3. 实战:从Excel到Pandas的数据清洗全流程

让我们通过一个完整的案例,演示如何将Excel中的数据清洗流程迁移到Pandas中。

3.1 数据准备

假设我们有一个包含员工信息的CSV文件,数据如下:

import pandas as pd data = { '员工ID': [101, 102, 103, 104, 105], '姓名': ['张三', '李四', '王五', '赵六', '钱七'], '部门': ['销售', '技术', '销售', '人事', '技术'], '入职日期': ['2020-01-15', '2019-05-22', '2021-03-10', '2018-11-05', '2022-02-18'], '薪资': [8500, 12000, 9000, 9500, 11000], '绩效': ['B', 'A', 'C', 'B', 'A'] } df = pd.DataFrame(data)

3.2 清洗需求与实现

需求1:删除绩效为C的员工记录

Excel做法:筛选绩效列,选择C的行,删除

Pandas实现:

df = df.drop(df[df['绩效'] == 'C'].index)

需求2:删除薪资低于10000且部门为销售的员工

Excel做法:高级筛选,设置两个条件,选择结果行,删除

Pandas实现:

condition = (df['薪资'] < 10000) & (df['部门'] == '销售') df = df.drop(df[condition].index)

需求3:删除不需要的列(员工ID和入职日期)

Excel做法:选中这两列,右键删除

Pandas实现:

df = df.drop(columns=['员工ID', '入职日期'])

3.3 完整清洗流程代码

# 读取数据 df = pd.read_csv('employee_data.csv') # 删除绩效为C的员工 df = df.drop(df[df['绩效'] == 'C'].index) # 删除薪资<10000且部门为销售的员工 condition = (df['薪资'] < 10000) & (df['部门'] == '销售') df = df.drop(df[condition].index) # 删除不需要的列 df = df.drop(columns=['员工ID', '入职日期']) # 保存清洗后的数据 df.to_csv('cleaned_employee_data.csv', index=False)

4. 高级技巧与常见问题解决

4.1 处理多层索引的删除

当DataFrame有多层索引时,可以使用level参数指定要删除的层级:

# 创建多层索引DataFrame index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)], names=['group', 'id']) df_multi = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index) # 删除group='A'的所有行 df_multi = df_multi.drop('A', level='group')

4.2 安全删除:避免KeyError

当尝试删除不存在的标签时,默认会抛出KeyError。可以使用errors='ignore'来避免:

# 安全删除,即使列'X'不存在也不会报错 df = df.drop(columns=['X'], errors='ignore')

4.3 性能优化:批量删除vs逐个删除

对于大型DataFrame,批量删除比循环删除效率高得多:

# 不推荐:循环删除 for name in ['张三', '李四']: df = df.drop(df[df['姓名'] == name].index) # 推荐:批量删除 condition = df['姓名'].isin(['张三', '李四']) df = df.drop(df[condition].index)

4.4 与相关方法的配合使用

.drop()常与其他数据清洗方法配合使用:

# 先删除重复行,再删除特定列 df = df.drop_duplicates().drop(columns=['temp_col']) # 删除空值过多的列后再删除剩余空值的行 df = df.dropna(axis=1, thresh=0.7*len(df)) # 删除70%以上为空的列 df = df.dropna() # 删除剩余包含空值的行

掌握这些技巧后,你会发现Pandas的数据清洗不仅功能强大,而且比Excel更加灵活高效。

← 返回列表