当前位置: 代码网 > it编程>前端脚本>Python > Python Pandas实现Excel数据选取和处理的完整指南

Python Pandas实现Excel数据选取和处理的完整指南

2026年07月16日 Python 我要评论
前言真实办公场景里,我们很少只是“打开一张表看一眼”。更多时候是:只要某几列,只看前几行,筛出满足条件的数据,按金额或日期排序,新增一列计算结果,最后删除无关列并导出。这些动作

前言

真实办公场景里,我们很少只是“打开一张表看一眼”。更多时候是:只要某几列,只看前几行,筛出满足条件的数据,按金额或日期排序,新增一列计算结果,最后删除无关列并导出。这些动作在 excel 里靠筛选、排序、公式和删除列完成,在 python 里主要靠 dataframe 的选取与处理完成。

本文重点围绕几个高频动作展开:按列选取、按行选取、按区块选取、条件筛选、排序、新增列、删除行列,以及如何把这些操作串成一个完整的数据处理链路。

我的理解是:dataframe 的选取和处理,本质上就是把 excel 里的“选列、筛选、排序、公式、删除”变成可以复用的代码流程。

为了演示方便,先准备一个小型 dataframe。后面所有示例都基于这张表展开。

import pandas as pd

data = pd.dataframe({
    "c1": ["a", "b", "c", "d"],
    "c2": [10, 30, 20, 30],
    "c3": [100, 200, 150, 80],
}, index=["r1", "r2", "r3", "r4"])

print(data)

这张图展示的是 dataframe 中“选列”和“选行”的基础思路。左侧是表格里的列和行,右侧对应的是 data['c1']data[['c1']]head()ilocloc 等常见写法。

从图中可以看出,dataframe 的数据选取不是只有一种写法。按列、按行、按标签、按位置都可以,但每种写法背后的含义不同。真正写脚本时,不能只看代码短不短,而要看当前需求到底是“按字段名选”,还是“按行列位置选”。

2. 为什么这一节是 pandas 办公自动化的核心

在办公自动化里,读取文件只是第一步。真正决定效率的,是读取以后怎么处理数据。比如财务表里只保留“电子设备”,资产表里只保留某个部门,销售表里按金额降序排序,人员名单里新增一列处理状态。这些都属于数据选取和处理。

如果不用 pandas,这些操作可能要靠手动筛选、复制粘贴、排序和公式拖拽完成。问题是,只要数据量稍微大一点,或者每个月都要重复做,这种手工方式就会变成低效且容易出错的工作。

推荐把这一节当成“excel 自动化处理链”的基本功:先会选,再会筛,再会排,再会算,最后会删和导出。

不要只记单个函数。真实工作里最有价值的不是会写 sort_values(),而是能把选取、筛选、排序、新增列、删除列串成稳定流程。

3. 按列选取:data[‘c1’] 和 data[[‘c1’]] 的区别

按列选取是最常见的操作。比如一张表里有几十列,但我只关心姓名、部门、金额、日期这些字段,就需要先把目标列选出来。

选取单列最常见的写法是:

col = data["c1"]
print(col)
print(type(col))

这时返回的是 series,可以理解成一维数据。它像 excel 里单独拿出来的一列,但不是完整二维表。

col_df = data[["c1"]]
print(col_df)
print(type(col_df))

这时返回的是 dataframe,仍然保持二维表结构。虽然只选了一列,但它仍然有表头和表格形态。

这里的关键区别是:data[‘c1’] 返回 seriesdata[[‘c1’]] 返回 dataframe

如果只是拿这一列做判断或计算,用 data["c1"] 很自然;如果后面还要拼接、导出、继续和其他列组成表,建议使用 data[["c1"]] 保留表结构。

推荐做法:新手阶段如果不确定后面是否还要保持表结构,优先用双中括号 data[[‘c1’]],这样更接近 excel 表格思维。

选取多列也使用双中括号:

cols = data[["c1", "c3"]]
print(cols)

这种写法在实际工作中非常高频,比如只保留“资产编号、资产名称、使用部门、净值”这些关键字段。

4. 按行选取:head、iloc、loc 怎么选

按行选取常用于查看数据样例、截取前几行、按索引标签定位某条记录。读取一张陌生表后,我一般不会马上写复杂逻辑,而是先用 head() 看一下数据长什么样。

print(data.head())
print(data.head(3))

head() 默认查看前 5 行,head(3) 查看前 3 行。它适合做快速预览,尤其是刚读完 excel 或 csv 后,用来确认字段名、行数、数据格式是否符合预期。

如果要按“位置”选行,推荐使用 iloc

print(data.iloc[0])
print(data.iloc[0:2])

iloc[0] 表示取第 0 行,也就是第一行;iloc[0:2] 表示取第 0 行到第 1 行,左闭右开。

如果要按“标签”选行,推荐使用 loc

print(data.loc["r2"])
print(data.loc["r2":"r4"])

loc["r2"] 表示取索引标签为 r2 的行。需要注意的是,loc["r2":"r4"] 这种标签切片通常会包含右端,也就是包含 r4

容易混淆的点:iloc 看位置,使用 0、1、2 这类数字;loc 看标签,使用索引名、日期、编号这类业务标签。

实际办公里,如果索引是自动生成的普通数字,iloc 更直观;如果索引是工号、日期、订单号,loc 读起来更像业务语言。

5. 按区块选取:iloc[row, col] 与 loc[rows, cols]

只选一列或一行还不够,实际处理表格时经常要选一块区域。比如取前 2 行前 2 列,或者取某几个行标签下的指定字段。这时就需要用到 iloc[row, col]loc[rows, cols]

iloc 按位置选区块:

print(data.iloc[0, 1])
print(data.iloc[0:2, 0:2])

data.iloc[0, 1] 表示第 0 行第 1 列,对应一个单元格值;data.iloc[0:2, 0:2] 表示前 2 行、前 2 列,对应一个小区块。

loc 按标签选区块:

print(data.loc["r2", "c3"])
print(data.loc["r1":"r3", ["c1", "c3"]])

data.loc["r2", "c3"] 表示取行标签为 r2、列名为 c3 的值;data.loc["r1":"r3", ["c1", "c3"]] 表示取 r1r3 这些行,并只保留 c1c3 两列。

这张图展示的是 ilocloc 选区块的区别。左侧是按数字位置选择,右侧是按行标签和列名选择。

从图中可以看出,iloc 更像“第几行第几列”,loc 更像“哪个编号、哪个字段”。如果数据表有明确业务索引,比如员工编号、资产编号、日期,loc 的可读性会更好。

一句话记忆:iloc 用位置,loc 用标签。位置适合临时截取,标签适合业务定位。

注意:不要把 iloc 的位置数字和 loc 的标签混着用。很多选错数据的问题,本质就是这两个概念没分清。

6. 条件筛选:从表里只保留符合条件的行

筛选是 pandas 里最接近 excel 筛选器的操作。它的本质不是修改原表,而是根据条件从原始表中“挑出符合条件的行”。

单条件筛选比较直观:

result = data[data["c2"] > 15]
print(result)

这段代码表示只保留 c2 大于 15 的行。它和 excel 里筛选“c2 大于 15”是同一种思路。

复合条件需要使用 &|

result = data[(data["c2"] == 30) & (data["c3"] >= 100)]
print(result)

这表示同时满足两个条件:c2 等于 30,并且 c3 大于等于 100。

result = data[(data["c2"] == 10) | (data["c3"] < 100)]
print(result)

这表示满足任意一个条件即可:c2 等于 10,或者 c3 小于 100。

这张图展示的是条件筛选的过程。原始表经过条件判断后,只保留符合条件的行,其他行会被过滤掉。

从图中可以看出,条件筛选更像是一个漏斗。原始数据进入漏斗,只有满足条件的数据会留下来。这也是 pandas 做报表清洗时最常用的动作之一。

两个坑必须记住:复合条件要用 &|,不能用 andor;每个条件都要用括号包起来。

推荐做法:筛选后先打印 result.shapelen(result),确认保留下来的行数是否符合预期。

print("筛选后行数:", len(result))
print("筛选后形状:", result.shape)

7. 排序:sort_values 和 sort_index

排序也是办公表格里非常高频的动作。比如按金额从高到低、按日期从早到晚、按部门和金额组合排序。在 pandas 中,按列排序主要使用 sort_values(),按索引排序主要使用 sort_index()

按某一列升序排序:

result = data.sort_values(by="c2")
print(result)

按某一列降序排序:

result = data.sort_values(by="c2", ascending=false)
print(result)

按多列排序也很常用。比如先按 c2 升序,再按 c3 降序:

result = data.sort_values(by=["c2", "c3"], ascending=[true, false])
print(result)

如果要按索引排序,可以使用:

result = data.sort_index()
print(result)

如果索引是日期、编号、工号,sort_index() 会非常有用。

这里可以把排序理解成:sort_values() 看数据列,sort_index() 看索引。

推荐做法:报表输出前最好明确排序规则,否则每次导出的表顺序可能不一致,后续对比和复核会很麻烦。

8. 新增列与删除行列:让表格真正完成加工

排序只是整理顺序,真正让数据产生新结果的动作,是新增列。它非常像 excel 里新增一列公式。比如把 c2 乘以 2,生成一个新的 c4 列。

data["c4"] = data["c2"] * 2
print(data)

也可以写更接近业务逻辑的组合计算:

data["c4"] = data["c2"] * 10 + data["c3"]
print(data)

这类操作在真实报表里非常常见,比如新增“含税金额”“折扣后金额”“处理状态”“是否达标”等字段。

这张图展示的是排序与新增列的处理逻辑。左侧是通过 sort_values() 调整数据顺序,右侧是通过 data['c4'] = ... 新增计算结果列。

从图中可以看出,排序解决的是“顺序问题”,新增列解决的是“结果生成问题”。在办公自动化里,这两个动作经常连在一起:先筛选和排序,再基于结果生成新字段。

删除列可以使用 drop(columns=...)

data2 = data.drop(columns=["c3"])
print(data2)

删除行可以使用 drop(index=...)

data2 = data.drop(index=["r1", "r3"])
print(data2)

如果使用 inplace=true,会直接修改原对象。

data.drop(columns=["c3"], inplace=true)

新手阶段不建议频繁使用 inplace=true。它会直接改掉原始对象,调试时不容易回退。更稳的做法是生成新变量,比如 data_new = data.drop(…)

推荐做法:删除前先确认列名和行标签,删除后打印 data.columnsdata.shape 做验证。

print(data.columns)
print(data.shape)

9. 把操作串起来:一个典型办公处理链

前面每个动作都是单点能力,但实际工作中更常见的是组合使用。比如现在有一个需求:筛选出 c2 >= 20 的行,然后按 c3 降序排序,再新增一列 c4 = c2 * 2,最后删除 c1

这类需求在真实工作里非常像“从原始表生成处理后报表”。可以这样写:

result = data[data["c2"] >= 20] \
    .sort_values(by="c3", ascending=false)

result["c4"] = result["c2"] * 2

result = result.drop(columns=["c1"])

print(result)

这段代码把筛选、排序、新增列、删除列串在一起。读起来就是一条清晰的处理链:先留下需要的数据,再调整顺序,再生成结果字段,最后去掉无关字段。

这张图展示的是完整的数据处理流程:读取 dataframe,然后依次完成选取、筛选、排序、新增列、删除,最后输出到 excel 或 csv。

从图中可以看出,一篇表格处理脚本的价值不在于某一个函数,而在于能不能把多个动作组织成稳定流程。对办公自动化来说,最终目标不是“会写一行代码”,而是把重复的数据处理动作固化下来。

这里的本质是:把 excel 里的手工筛选、排序、公式、删除列,转换成一条可以重复执行的代码流水线。

建议保存这种处理链模板。以后遇到类似报表,只需要替换列名、条件和计算公式,就可以快速复用。

10. 常见问题和踩坑提醒

第一个常见问题是:为什么 data['c1']data[['c1']] 看起来差不多,但后面处理结果不一样?原因是前者返回 series,后者返回 dataframe。一个是一维数据,一个是二维表结构,后续拼接、导出、选择多列时行为会不同。

第二个常见问题是:为什么复合筛选条件报错?大概率是用了 and / or,或者条件没有加括号。pandas 里多个条件要用 & / |,并且每个条件都要括起来。

# 正确写法
result = data[(data["c2"] == 30) & (data["c3"] >= 100)]

第三个常见问题是:为什么 lociloc 选出来的数据不一样?因为 loc 走标签,iloc 走位置。标签不一定等于位置,尤其是索引被改成工号、日期、编号以后,更不能混用。

第四个常见问题是:为什么新增列时报 settingwithcopywarning?通常是因为你对筛选后的切片结果继续赋值,pandas 不确定你是在改原数据还是副本。更稳的做法是筛选后使用 .copy()

result = data[data["c2"] >= 20].copy()
result["c4"] = result["c2"] * 2

这类警告不要无视。它不一定立刻导致错误,但说明你的赋值逻辑可能不够明确,后面脚本复杂后容易出现结果不稳定。

第五个常见问题是:为什么删除列以后找不到原字段了?如果你使用了 inplace=true,原对象已经被直接修改。新手阶段建议尽量生成新对象,保留原数据用于回退和对比。

推荐调试习惯:每一步处理后打印 shapecolumns 或前几行结果,确认数据结构没有偏离预期。

print("当前形状:", result.shape)
print("当前列名:", result.columns.tolist())
print(result.head())

11. 总结

这一节的核心,是掌握 dataframe 日常处理数据的几个基础动作:选列、选行、选区块、筛选、排序、新增列和删除。它们看起来是零散函数,但放到办公自动化里,其实就是一条完整的数据清洗与整理链路。

我把本文重点压缩成几句话:data['c1'] 返回 seriesdata[['c1']] 返回 dataframeiloc 按位置选,loc 按标签选;复合筛选用 & / |,条件必须加括号;排序用 sort_values()sort_index();新增列就是写一整列公式;删除时谨慎使用 inplace=true

对我来说,这一节最有价值的地方,不是某个函数本身,而是开始把 excel 的手工操作翻译成代码流程。只要这个思路建立起来,后续做月报、资产表、人员名单、设备清单、故障统计表,很多重复动作都可以自动化。

我的最终理解是:pandas 的表格处理能力,本质上是在用代码重建 excel 的筛选、排序、公式和清洗流程。

后续写办公自动化脚本时,可以优先按“读取 → 选取 → 筛选 → 排序 → 新增列 → 删除 → 导出”的顺序设计脚本。

真正需要警惕的不是代码不会写,而是没验证每一步处理后的数据是否符合预期。表格处理最怕静默错误:代码不报错,但结果已经错了。

以上就是python pandas实现excel数据选取和处理的完整指南的详细内容,更多关于python pandas excel数据选取和处理的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com