logo

30分钟掌握pandas高频操作:从数据导入到实战清洗

作者:php是最好的2026.11.07 01:41浏览量:0

简介:本文面向数据分析初学者与需要快速复习的开发者,系统梳理pandas中最常用的数据导入导出、查看、选择、清洗、转换与合并方法。通过结构化讲解与可运行示例,帮助读者在30分钟内建立完整的数据处理思路,并可将其作为后续查询与实战的速查手册。

一、为什么需要一套高频方法清单

在数据分析、数据工程与报表开发中,表格数据处理通常占据大量时间。pandas 作为 Python 生态中处理结构化数据的通用库,提供了丰富的接口,但初学者常遇到的问题并不是“没有函数可用”,而是“不知道在什么阶段应该调用哪类方法”。因此,比起零散记忆 API,更有效的方式是先建立数据处理的基本流程:

  1. 导入数据;
  2. 查看数据规模、类型与基本信息;
  3. 选择所需行列;
  4. 清洗缺失值、重复值与异常值;
  5. 转换类型、排序、分组与透视;
  6. 合并多张表;
  7. 导出处理结果。

本文按上述流程挑选高频方法,所有示例均采用通用数据场景,便于直接迁移到实际业务中。

二、数据导入与导出

2.1 从常见文件导入

日常工作中,数据通常来自 CSV、Excel 或数据库查询结果。导入后应立刻检查数据形状与内容,避免后续处理建立在错误读取的基础上。

  1. import pandas as pd
  2. # 从CSV导入
  3. df = pd.read_csv("data.csv", encoding="utf-8")
  4. # 从Excel导入,可指定工作表
  5. df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
  6. # 从字典快速构造DataFrame
  7. data = {
  8. "姓名": ["张三", "李四", "王五"],
  9. "年龄": [25, 30, 35],
  10. "城市": ["北京", "上海", "广州"]
  11. }
  12. df = pd.DataFrame(data)

对于数据库导入,可以先创建连接引擎,再执行查询。这里以通用 SQL 数据库连接方式表示:

  1. from sqlalchemy import create_engine
  2. engine = create_engine("sqlite:///example.db")
  3. df = pd.read_sql("SELECT * FROM employee", engine)

需要特别注意的是,编码问题在 CSV 导入中较为常见。若文件包含中文,可尝试 utf-8-sig 或 gbk 编码,避免出现乱码。

2.2 导出数据

导出时建议设置 index=False,避免将 DataFrame 的行索引写入文件。若目标文件需要被 Excel 打开且包含中文,可优先使用 utf-8-sig 编码。

  1. # 导出为CSV
  2. df.to_csv("output.csv", index=False, encoding="utf-8-sig")
  3. # 导出为Excel
  4. df.to_excel("output.xlsx", sheet_name="结果", index=False)
  5. # 写入数据库,if_exists可选择替换或追加
  6. df.to_sql("employee_new", engine, if_exists="replace", index=False)

三、数据查看与基础信息

导入数据后,第一步不是直接计算,而是快速了解数据的规模、类型与分布。

  1. # 查看前3行
  2. df.head(3)
  3. # 查看后2行
  4. df.tail(2)
  5. # 查看列类型、非空数量与内存占用
  6. df.info()
  7. # 查看数值列的统计摘要
  8. df.describe()
  9. # 查看行列数
  10. df.shape
  11. # 查看列名与索引
  12. df.columns
  13. df.index

其中 info() 最适合发现类型错误,例如日期被识别为字符串、数值被识别为对象类型;describe() 可快速观察均值、极值与分位数,帮助发现异常值。

四、数据选择与过滤

4.1 选择列

  1. # 选择单列,返回Series
  2. df["姓名"]
  3. # 选择多列,返回DataFrame
  4. df[["姓名", "年龄"]]
  5. # 当列名符合Python标识符规则时,可使用点号
  6. df.年龄

单列选择返回 Series,多列选择返回 DataFrame,这一差异会影响后续可调用的方法。例如 Series 可直接使用 .value_counts(),而 DataFrame 需要先指定列。

4.2 过滤行

条件过滤是数据分析中使用频率最高的操作之一。常见做法是生成布尔序列,再将其传入 DataFrame。

  1. # 年龄大于30
  2. df[df["年龄"] > 30]
  3. # 多条件过滤,注意使用 & 和括号
  4. df[(df["年龄"] >= 30) & (df["城市"] == "上海")]
  5. # 使用isin筛选多个值
  6. df[df["城市"].isin(["北京", "深圳"])]

使用 query 方法也可以提升复杂条件的可读性:

  1. df.query("年龄 >= 30 and 城市 == '上海'")

五、数据清洗与处理

5.1 缺失值处理

处理缺失值前,需要先判断缺失值数量,再决定删除或填充。

  1. # 查看每列缺失值数量
  2. df.isnull().sum()
  3. # 删除包含缺失值的行
  4. df.dropna()
  5. # 用固定值或统计值填充
  6. df["工资"].fillna(0)
  7. df["工资"].fillna(df["工资"].mean())

5.2 重复值处理

  1. # 查看重复行
  2. df.duplicated().sum()
  3. # 删除重复行
  4. df.drop_duplicates()
  5. # 按指定列去重
  6. df.drop_duplicates(subset=["姓名"])

5.3 类型转换

  1. # 转为日期类型
  2. df["入职日期"] = pd.to_datetime(df["入职日期"])
  3. # 转为数值类型
  4. df["工资"] = pd.to_numeric(df["工资"], errors="coerce")
  5. # 转为分类类型,降低内存占用
  6. df["城市"] = df["城市"].astype("category")

日期类型转换后,可以方便地提取年份、月份、星期等信息,为后续聚合提供维度。

六、数据转换与重塑

6.1 排序与排名

  1. # 按工资降序
  2. df.sort_values("工资", ascending=False)
  3. # 多列排序
  4. df.sort_values(["城市", "工资"], ascending=[True, False])

6.2 分组聚合

  1. # 按城市统计平均工资
  2. df.groupby("城市")["工资"].mean()
  3. # 同时聚合多个指标
  4. df.groupby("城市").agg(
  5. 平均工资=("工资", "mean"),
  6. 最大年龄=("年龄", "max"),
  7. 人数=("姓名", "count")
  8. )

6.3 数据透视

  1. pd.pivot_table(
  2. df,
  3. values="工资",
  4. index="城市",
  5. columns="入职年份",
  6. aggfunc="mean"
  7. )

透视表适合将细粒度数据汇总为报表结构,尤其适合多维度的平均值、求和与计数分析。

七、数据合并与连接

实际业务中,往往需要将多张表按共同字段合并。merge 是最常用的方式,其行为类似于关系型数据库中的表连接。

  1. left = pd.DataFrame({
  2. "员工ID": [1, 2, 3],
  3. "姓名": ["张三", "李四", "王五"]
  4. })
  5. right = pd.DataFrame({
  6. "员工ID": [2, 3, 4],
  7. "部门": ["研发", "市场", "财务"]
  8. })
  9. # 内连接
  10. pd.merge(left, right, on="员工ID", how="inner")
  11. # 左连接
  12. pd.merge(left, right, on="员工ID", how="left")

纵向拼接则使用 concat:

  1. pd.concat([df1, df2], axis=0, ignore_index=True)

横向拼接可使用 axis=1,但需要确保行索引对齐,否则容易产生大量缺失值。

八、一个综合实战案例

下面通过一个小型员工信息表串联上述方法。假设我们需要完成以下任务:导入数据、检查信息、过滤有效记录、补全缺失工资、按城市统计人数与平均工资,并导出结果。

  1. import pandas as pd
  2. import numpy as np
  3. # 1. 构造数据
  4. df = pd.DataFrame({
  5. "姓名": ["张三", "李四", "王五", "赵六", "钱七", "孙八"],
  6. "年龄": [25, 30, 35, 40, 45, 28],
  7. "城市": ["北京", "上海", "广州", "深圳", "杭州", "北京"],
  8. "工资": [10000, 15000, np.nan, 20000, 25000, 18000],
  9. "入职日期": ["2020-01-15", "2019-05-20", "2021-03-10",
  10. "2018-07-05", "2022-02-28", "2023-06-01"]
  11. })
  12. # 2. 类型转换
  13. df["入职日期"] = pd.to_datetime(df["入职日期"])
  14. # 3. 查看基本信息
  15. print(df.info())
  16. print(df.isnull().sum())
  17. # 4. 填充缺失工资
  18. df["工资"] = df["工资"].fillna(df["工资"].mean())
  19. # 5. 过滤出年龄在30岁及以上且工资高于均值的员工
  20. avg_salary = df["工资"].mean()
  21. result = df[(df["年龄"] >= 30) & (df["工资"] > avg_salary)]
  22. # 6. 按城市聚合
  23. summary = df.groupby("城市").agg(
  24. 人数=("姓名", "count"),
  25. 平均工资=("工资", "mean"),
  26. 最高工资=("工资", "max")
  27. ).reset_index()
  28. # 7. 导出
  29. summary.to_csv("summary.csv", index=False, encoding="utf-8-sig")

该案例覆盖了数据导入、类型修复、缺失值处理、条件过滤、分组聚合与导出六个关键步骤,可视为日常数据处理的基础模板。

九、建议与常见问题

  • 尽早检查数据类型:字符串与日期混淆会导致后续筛选失败。
  • 条件过滤时注意运算符优先级:多个条件建议使用括号包裹,避免逻辑错误。
  • 处理大文件时先抽样:可先读取少量行观察结构,再设置合适参数导入完整文件。
  • 导出前重置索引:若经过多次筛选、排序或拼接,建议执行 reset_index(drop=True),避免索引混乱。

掌握上述方法并不意味着记忆所有参数,而是在遇到数据处理任务时,能够迅速判断“当前应使用哪一类操作”,再根据实际需求查询对应参数。经过若干次完整练习后,大部分表格数据清洗与分析工作都可以在较短时间内完成。

发表评论

活动