30分钟掌握pandas高频操作:从数据导入到实战清洗
作者:php是最好的2026.11.07 01:41浏览量:0简介:本文面向数据分析初学者与需要快速复习的开发者,系统梳理pandas中最常用的数据导入导出、查看、选择、清洗、转换与合并方法。通过结构化讲解与可运行示例,帮助读者在30分钟内建立完整的数据处理思路,并可将其作为后续查询与实战的速查手册。
一、为什么需要一套高频方法清单
在数据分析、数据工程与报表开发中,表格数据处理通常占据大量时间。pandas 作为 Python 生态中处理结构化数据的通用库,提供了丰富的接口,但初学者常遇到的问题并不是“没有函数可用”,而是“不知道在什么阶段应该调用哪类方法”。因此,比起零散记忆 API,更有效的方式是先建立数据处理的基本流程:
- 导入数据;
- 查看数据规模、类型与基本信息;
- 选择所需行列;
- 清洗缺失值、重复值与异常值;
- 转换类型、排序、分组与透视;
- 合并多张表;
- 导出处理结果。
本文按上述流程挑选高频方法,所有示例均采用通用数据场景,便于直接迁移到实际业务中。
二、数据导入与导出
2.1 从常见文件导入
日常工作中,数据通常来自 CSV、Excel 或数据库查询结果。导入后应立刻检查数据形状与内容,避免后续处理建立在错误读取的基础上。
import pandas as pd# 从CSV导入df = pd.read_csv("data.csv", encoding="utf-8")# 从Excel导入,可指定工作表df = pd.read_excel("data.xlsx", sheet_name="Sheet1")# 从字典快速构造DataFramedata = {"姓名": ["张三", "李四", "王五"],"年龄": [25, 30, 35],"城市": ["北京", "上海", "广州"]}df = pd.DataFrame(data)
对于数据库导入,可以先创建连接引擎,再执行查询。这里以通用 SQL 数据库连接方式表示:
from sqlalchemy import create_engineengine = create_engine("sqlite:///example.db")df = pd.read_sql("SELECT * FROM employee", engine)
需要特别注意的是,编码问题在 CSV 导入中较为常见。若文件包含中文,可尝试 utf-8-sig 或 gbk 编码,避免出现乱码。
2.2 导出数据
导出时建议设置 index=False,避免将 DataFrame 的行索引写入文件。若目标文件需要被 Excel 打开且包含中文,可优先使用 utf-8-sig 编码。
# 导出为CSVdf.to_csv("output.csv", index=False, encoding="utf-8-sig")# 导出为Exceldf.to_excel("output.xlsx", sheet_name="结果", index=False)# 写入数据库,if_exists可选择替换或追加df.to_sql("employee_new", engine, if_exists="replace", index=False)
三、数据查看与基础信息
导入数据后,第一步不是直接计算,而是快速了解数据的规模、类型与分布。
# 查看前3行df.head(3)# 查看后2行df.tail(2)# 查看列类型、非空数量与内存占用df.info()# 查看数值列的统计摘要df.describe()# 查看行列数df.shape# 查看列名与索引df.columnsdf.index
其中 info() 最适合发现类型错误,例如日期被识别为字符串、数值被识别为对象类型;describe() 可快速观察均值、极值与分位数,帮助发现异常值。
四、数据选择与过滤
4.1 选择列
# 选择单列,返回Seriesdf["姓名"]# 选择多列,返回DataFramedf[["姓名", "年龄"]]# 当列名符合Python标识符规则时,可使用点号df.年龄
单列选择返回 Series,多列选择返回 DataFrame,这一差异会影响后续可调用的方法。例如 Series 可直接使用 .value_counts(),而 DataFrame 需要先指定列。
4.2 过滤行
条件过滤是数据分析中使用频率最高的操作之一。常见做法是生成布尔序列,再将其传入 DataFrame。
# 年龄大于30df[df["年龄"] > 30]# 多条件过滤,注意使用 & 和括号df[(df["年龄"] >= 30) & (df["城市"] == "上海")]# 使用isin筛选多个值df[df["城市"].isin(["北京", "深圳"])]
使用 query 方法也可以提升复杂条件的可读性:
df.query("年龄 >= 30 and 城市 == '上海'")
五、数据清洗与处理
5.1 缺失值处理
处理缺失值前,需要先判断缺失值数量,再决定删除或填充。
# 查看每列缺失值数量df.isnull().sum()# 删除包含缺失值的行df.dropna()# 用固定值或统计值填充df["工资"].fillna(0)df["工资"].fillna(df["工资"].mean())
5.2 重复值处理
# 查看重复行df.duplicated().sum()# 删除重复行df.drop_duplicates()# 按指定列去重df.drop_duplicates(subset=["姓名"])
5.3 类型转换
# 转为日期类型df["入职日期"] = pd.to_datetime(df["入职日期"])# 转为数值类型df["工资"] = pd.to_numeric(df["工资"], errors="coerce")# 转为分类类型,降低内存占用df["城市"] = df["城市"].astype("category")
日期类型转换后,可以方便地提取年份、月份、星期等信息,为后续聚合提供维度。
六、数据转换与重塑
6.1 排序与排名
# 按工资降序df.sort_values("工资", ascending=False)# 多列排序df.sort_values(["城市", "工资"], ascending=[True, False])
6.2 分组聚合
# 按城市统计平均工资df.groupby("城市")["工资"].mean()# 同时聚合多个指标df.groupby("城市").agg(平均工资=("工资", "mean"),最大年龄=("年龄", "max"),人数=("姓名", "count"))
6.3 数据透视
pd.pivot_table(df,values="工资",index="城市",columns="入职年份",aggfunc="mean")
透视表适合将细粒度数据汇总为报表结构,尤其适合多维度的平均值、求和与计数分析。
七、数据合并与连接
实际业务中,往往需要将多张表按共同字段合并。merge 是最常用的方式,其行为类似于关系型数据库中的表连接。
left = pd.DataFrame({"员工ID": [1, 2, 3],"姓名": ["张三", "李四", "王五"]})right = pd.DataFrame({"员工ID": [2, 3, 4],"部门": ["研发", "市场", "财务"]})# 内连接pd.merge(left, right, on="员工ID", how="inner")# 左连接pd.merge(left, right, on="员工ID", how="left")
纵向拼接则使用 concat:
pd.concat([df1, df2], axis=0, ignore_index=True)
横向拼接可使用 axis=1,但需要确保行索引对齐,否则容易产生大量缺失值。
八、一个综合实战案例
下面通过一个小型员工信息表串联上述方法。假设我们需要完成以下任务:导入数据、检查信息、过滤有效记录、补全缺失工资、按城市统计人数与平均工资,并导出结果。
import pandas as pdimport numpy as np# 1. 构造数据df = pd.DataFrame({"姓名": ["张三", "李四", "王五", "赵六", "钱七", "孙八"],"年龄": [25, 30, 35, 40, 45, 28],"城市": ["北京", "上海", "广州", "深圳", "杭州", "北京"],"工资": [10000, 15000, np.nan, 20000, 25000, 18000],"入职日期": ["2020-01-15", "2019-05-20", "2021-03-10","2018-07-05", "2022-02-28", "2023-06-01"]})# 2. 类型转换df["入职日期"] = pd.to_datetime(df["入职日期"])# 3. 查看基本信息print(df.info())print(df.isnull().sum())# 4. 填充缺失工资df["工资"] = df["工资"].fillna(df["工资"].mean())# 5. 过滤出年龄在30岁及以上且工资高于均值的员工avg_salary = df["工资"].mean()result = df[(df["年龄"] >= 30) & (df["工资"] > avg_salary)]# 6. 按城市聚合summary = df.groupby("城市").agg(人数=("姓名", "count"),平均工资=("工资", "mean"),最高工资=("工资", "max")).reset_index()# 7. 导出summary.to_csv("summary.csv", index=False, encoding="utf-8-sig")
该案例覆盖了数据导入、类型修复、缺失值处理、条件过滤、分组聚合与导出六个关键步骤,可视为日常数据处理的基础模板。
九、建议与常见问题
- 尽早检查数据类型:字符串与日期混淆会导致后续筛选失败。
- 条件过滤时注意运算符优先级:多个条件建议使用括号包裹,避免逻辑错误。
- 处理大文件时先抽样:可先读取少量行观察结构,再设置合适参数导入完整文件。
- 导出前重置索引:若经过多次筛选、排序或拼接,建议执行
reset_index(drop=True),避免索引混乱。
掌握上述方法并不意味着记忆所有参数,而是在遇到数据处理任务时,能够迅速判断“当前应使用哪一类操作”,再根据实际需求查询对应参数。经过若干次完整练习后,大部分表格数据清洗与分析工作都可以在较短时间内完成。

登录后可评论,请前往 登录 或 注册