从零开始:NumPy + Pandas 数据清洗与可视化

张开发
2026/4/13 22:52:01 15 分钟阅读

分享文章

从零开始:NumPy + Pandas 数据清洗与可视化
用 Python 处理数据这一篇就够了这篇文章会用最通俗的语言和完整的代码示例带你一次性搞定· NumPy 基础快速计算· Pandas 核心数据清洗的十八般武艺· 可视化入门用 matplotlib 画出会说话的图读完你就能独立处理一份真实的 CSV 数据。第一部分NumPy —— 数据界的计算器NumPy 是 Python 科学计算的基石。它的核心是 ndarrayN维数组可以理解为“升级版的列表”。1.1 安装与导入pip install numpy pandas matplotlibpythonimport numpy as np import pandas as pd import matplotlib.pyplot as plt1.2 创建数组# 从列表创建 arr np.array([1, 2, 3, 4, 5]) print(arr) # [1 2 3 4 5] # 创建全0数组 zeros np.zeros(5) # [0. 0. 0. 0. 0.] # 创建连续数列 range_arr np.arange(0, 10, 2) # [0 2 4 6 8] # 均匀间隔 lin np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ]1.3 数组运算比循环快100倍a np.array([1, 2, 3]) b np.array([4, 5, 6]) # 逐个元素运算 print(a b) # [5 7 9] print(a * b) # [4 10 18] print(a ** 2) # [1 4 9] # 常用统计函数 data np.array([1, 5, 3, 8, 2]) print(data.mean()) # 平均值3.8 print(data.max()) # 最大值8 print(data.std()) # 标准差2.42 为什么用 NumPy对10万元素求和用 NumPy 比纯 Python 快约100倍。第二部分Pandas —— 数据清洗神器Pandas 提供了 DataFrame表格 结构就像 Excel 工作表但功能强大得多。2.1 创建 DataFrame# 从字典创建 df pd.DataFrame({ 姓名: [张三, 李四, 王五, 赵六], 年龄: [25, 30, 22, None], # None 表示缺失值 城市: [北京, 上海, 北京, 深圳], 工资: [8000, 12000, 9500, 11000] }) print(df)输出姓名 年龄 城市 工资张三 25.0 北京 8000李四 30.0 上海 12000王五 22.0 北京 9500赵六 NaN 深圳 110002.2 查看数据df.head(2) # 前2行 df.tail(2) # 后2行 df.info() # 整体信息有无缺失值、数据类型 df.describe() # 统计摘要均值、最大最小等2.3 数据清洗核心技能# 方法1删除含缺失值的行 df_cleaned df.dropna() # 方法2填充缺失值 df[年龄] df[年龄].fillna(df[年龄].mean()) # 用平均值填充 处理重复值 python # 检查重复 df.duplicated().sum() # 删除重复 df df.drop_duplicates() 数据类型转换 python # 查看类型 print(df.dtypes) # 转换类型 df[年龄] df[年龄].astype(int) 筛选数据类似 Excel 筛选 python # 年龄大于25的人 df[df[年龄] 25] # 城市是北京且工资大于9000 df[(df[城市] 北京) (df[工资] 9000)] # 使用 isin 筛选多个城市 df[df[城市].isin([北京, 上海])] 新增/修改列 python # 新增一列年薪 df[年薪] df[工资] * 12 # 根据条件新增列 df[收入等级] df[工资].apply(lambda x: 高 if x 10000 else 中)分组聚合类似 Excel 透视表# 按城市分组计算平均工资 grouped df.groupby(城市)[工资].mean() print(grouped)输出城市北京 8750.0上海 12000.0深圳 11000.0合并数据类似 SQL JOINdf1 pd.DataFrame({ID: [1, 2], 姓名: [张三, 李四]}) df2 pd.DataFrame({ID: [1, 2], 年龄: [25, 30]}) merged pd.merge(df1, df2, onID)第三部分实战案例 —— 清洗一份真实数据假设我们有一个 employees.csv 文件员工数据存在各种问题。数据预览pythondf pd.read_csv(employees.csv)print(df.head())姓名 年龄 部门 工资 入职年份张三 25 销售 8000 2020李四 30 技术 12000 2019王五 - 技术 9500 2021赵六 22 - 11000 2020钱七 28 销售 8000 2020完整清洗流程python# 1. 读取数据df pd.read_csv(employees.csv)# 2. 处理缺失值df[年龄] df[年龄].replace(-, np.nan) # 将-转为NaNdf[年龄] df[年龄].astype(float)df[年龄] df[年龄].fillna(df[年龄].median()) # 用中位数填充df[部门] df[部门].fillna(未知)# 3. 处理异常值年龄不可能大于100df df[df[年龄] 100]# 4. 删除重复行df df.drop_duplicates()# 5. 新增列工龄假设当前年份2025df[工龄] 2025 - df[入职年份]# 6. 筛选只保留工资大于5000且工龄3年的员工df_filtered df[(df[工资] 5000) (df[工龄] 3)]# 7. 分组统计各部门平均工资result df_filtered.groupby(部门)[工资].mean().round(2)print(result)第四部分数据可视化 —— 让数字说话matplotlib 是 Python 最基础的绘图库就像画图工具虽不华丽但什么都能画。4.1 基础绘图import matplotlib.pyplot as plt # 准备数据 x [1, 2, 3, 4, 5] y [2, 4, 6, 8, 10] # 折线图 plt.plot(x, y, markero, linestyle--, colorr, labely2x) plt.xlabel(X轴) plt.ylabel(Y轴) plt.title(折线图示例) plt.legend() plt.show()4.2 四种常用图表柱状图 —— 对比不同类别# 各部门平均工资departments [技术, 销售, 运营] avg_salary [12500, 8500, 9000] plt.bar(departments, avg_salary, color[blue, green, orange]) plt.title(各部门平均工资对比) plt.ylabel(平均工资元) plt.show()饼图 —— 查看占比# 各部门人数占比 sizes [35, 40, 25] labels [技术, 销售, 运营] plt.pie(sizes, labelslabels, autopct%1.1f%%, startangle90) plt.title(各部门人数占比) plt.axis(equal) # 确保饼图是圆的 plt.show()直方图 —— 查看数据分布# 年龄分布 ages [22, 25, 25, 28, 30, 31, 35, 38, 40, 45] plt.hist(ages, bins5, colorskyblue, edgecolorblack) plt.title(员工年龄分布) plt.xlabel(年龄) plt.ylabel(人数) plt.show()散点图 —— 看两个变量的关系# 工龄与工资的关系 experience [1, 2, 3, 4, 5, 6, 7, 8] salary [8000, 9000, 10500, 11500, 13000, 14000, 15500, 16500] plt.scatter(experience, salary, alpha0.7, cred) plt.title(工龄与工资的关系) plt.xlabel(工龄年) plt.ylabel(工资元) plt.grid(True, linestyle--, alpha0.5) plt.show()

更多文章