Python pandas DataFrame选取筛选排序新增列实战教程
在办公自动化场景中,使用Python处理Excel表格的核心在于掌握DataFrame的选取与加工操作。本文围绕高频动作展开:按列选取、按行选取、按区块选取、条件筛选、排序、新增列与删除行列,并演示如何将这些操作串联成完整的数据处理链路。首先准备演示用的DataFrame:
import pandas as pd
data = pd.DataFrame({
"c1": ["A", "B", "C", "D"],
"c2": ,
"c3": ,
}, index=["r1", "r2", "r3", "r4"])
print(data)
按列选取:data['c1']与data[['c1']]的区别
最常见的操作用data["c1"]返回Series(一维数据),而data[["c1"]]返回DataFrame(二维表结构)。
col = data["c1"]
print(type(col))# Series
col_df = data[["c1"]]
print(type(col_df))# DataFrame
若后续需要拼接、导出或继续以表格形式操作,建议优先使用双中括号以保留表结构。选取多列也使用相同语法:data[["c1", "c3"]]。
按行选取:head、iloc、loc如何选
head()用于快速预览数据:data.head(3)查看前3行。
iloc按位置选取:data.iloc取第一行,data.iloc取第0行到第1行(左闭右开)。
loc按标签选取:data.loc["r2"]取索引为r2的行,loc["r2":"r4"]包含右端点r4。
print(data.iloc) # 第一行
print(data.iloc) # 前两行
print(data.loc["r2"]) # 标签r2
print(data.loc["r2":"r4"]) # 标签r2到r4
iloc用数字位置,loc用业务标签(如工号、日期),根据索引类型选择合适的方法。
按区块选取:iloc与loc
iloc可以定位单元格或矩形区域:
print(data.iloc) # 第0行第1列的值
print(data.iloc) # 前2行前2列的子表
loc则按标签定位:
print(data.loc["r2", "c3"]) # 标签r2、列c3的值
print(data.loc["r1":"r3", ["c1", "c3"]])# r1到r3行,仅c1和c3列
注意:iloc与loc不可混用,否则会选错数据。
条件筛选:只保留符合条件的行
单条件筛选:data > 15] 保留c2大于15的行。
复合条件必须使用&(与)和|(或),且每个条件用括号包裹:
# 正确写法
result = data[(data["c2"] == 30) & (data["c3"] >= 100)]
常见错误:使用and/or或忘记加括号。筛选后建议检查行数:print(len(result))。
排序:sort_values与sort_index
按列排序:
result = data.sort_values(by="c2", ascending=False)# 降序
result = data.sort_values(by=["c2", "c3"], ascending=) # 多列
按索引排序:data.sort_index(),适用于日期或编号索引。
新增列与删除行列
新增列类似Excel公式:
data["c4"] = data["c2"] * 2
# 或组合计算
data["c4"] = data["c2"] * 10 + data["c3"]
删除行列使用drop:
data2 = data.drop(columns=["c3"]) # 删除列
data2 = data.drop(index=["r1", "r3"])# 删除行
inplace=True会直接修改原DataFrame,新手建议生成新变量,便于调试。
串联完整处理链
实际工作中常需组合操作:筛选c2>=20的行,按c3降序排序,新增c4=c2*2,最后删除c1列。
result = data >= 20].sort_values(by="c3", ascending=False)
result["c4"] = result["c2"] * 2
result = result.drop(columns=["c1"])
print(result)
这种链式写法将Excel手工筛选、排序、公式、删除列转化为可重复执行的代码流。
常见踩坑与建议
1. 复合条件必须使用& / |并加括号,不能用and/or。
2. loc与iloc按标签/位置本质不同,混用会取错数据。
3. 对筛选切片赋值可能触发SettingWithCopyWarning,建议使用.copy():
result = data >= 20].copy()
result["c4"] = result["c2"] * 2
4. 删除列时慎用inplace=True,尽量保留原数据。
5. 每一步处理后打印shape和columns,验证数据是否符合预期。
总结
DataFrame的选取与处理是pandas办公自动化的核心。掌握按列选取(单列/多列)、按行选取(位置/标签)、区块定位、条件筛选、排序、新增列与删除行,就能将Excel手工操作翻译成稳定、可复用的代码。建议按“读取→选取→筛选→排序→新增列→删除→导出”顺序设计脚本,并重视每一步的验证,避免静默错误。
Re: Python pandas DataFrame选取筛选排序新增列实战教程
感谢楼主的详细教程!特别是关于 `data['c1']` 和 `data[['c1']]` 的区别、条件筛选时 & 必须加括号的提醒,以及 `SettingWithCopyWarning` 的处理建议,都是新手容易踩坑的地方,讲得很清楚。想请教一下,在串联完整处理链的时候,如果中间需要多次筛选和新增列,用 `.copy()` 创建副本后操作,是不是比链式写法更安全、更易调试?Re: Python pandas DataFrame选取筛选排序新增列实战教程
非常干货的教程!感谢楼主的详细讲解,特别是 `iloc` 与 `loc` 的区别、复合条件筛选的括号与 `&` 用法,还有 `SettingWithCopyWarning` 的防范,这些都是新手最容易踩坑的地方。我平时用 pandas 处理报表时,经常需要把筛选、排序、新增列串起来操作,楼主最后那个完整处理链的例子特别实用——相当于把 Excel 里的多步手工操作变成一行行可复用的代码,对办公自动化帮助很大。有个小问题想请教:如果源数据有缺失值,在筛选前一般先做 `dropna` 还是可以在筛选条件里直接用 `notna` 处理?期待楼主后续还能分享更多实战案例。Re: Python pandas DataFrame选取筛选排序新增列实战教程
这篇教程非常实用,把DataFrame最常用的操作和容易踩坑的点都讲清楚了,尤其是`loc`和`iloc`的区别、复合条件筛选加括号、以及赋值时用`.copy()`避免警告,都是新手经常忽略但至关重要的细节。对初学者来说,能照着这个链式处理的思路一步步操作,很快就能上手处理Excel表格了。感谢分享!
页:
[1]