
在日常数据处理工作中我们经常面临数据格式混乱、分析效率低下的困扰。特别是从Excel、CSV等文件导入数据后需要进行大量的清洗、转换和计算操作传统方法往往耗时耗力。Pandas作为Python数据分析的核心利器能够显著提升数据处理效率本文将系统讲解从基础到实战的完整知识体系。无论你是刚接触数据分析的新手还是需要快速查阅特定功能的开发者本文都将提供可直接复用的代码示例和工程实践建议。我们将覆盖Pandas环境搭建、核心数据结构、数据清洗、数据分析、可视化集成等全流程内容每个环节都配有可运行的代码示例和常见问题解决方案。1. Pandas核心概念与价值定位1.1 什么是PandasPandas是一个开源的Python数据分析库提供了高效、灵活的数据结构专门用于处理结构化数据表格数据。它构建在NumPy之上使得数据处理变得简单直观。Pandas这个名字来源于Panel Data面板数据的缩写体现了其处理多维数据的能力。在实际项目中Pandas主要解决以下问题数据清洗处理缺失值、重复值、异常值数据转换数据类型转换、数据重塑、数据合并数据分析描述性统计、分组聚合、时间序列分析数据可视化与Matplotlib、Seaborn等库无缝集成1.2 Pandas在数据分析生态中的位置Pandas在Python数据分析生态中处于核心地位。它与NumPy、Matplotlib、Scikit-learn等库形成了完整的数据分析工具链NumPy提供高效的数值计算基础Pandas专注于表格数据处理和分析Matplotlib/Seaborn数据可视化展示Scikit-learn机器学习算法实现这种分工协作使得每个库都能专注于自己最擅长的领域而Pandas正是连接数据预处理和高级分析的桥梁。1.3 为什么选择Pandas与其他数据处理工具相比Pandas具有明显优势性能优异底层基于NumPy关键操作使用Cython优化功能全面从数据读取到复杂分析提供一站式解决方案API设计优雅方法链式调用代码可读性强社区活跃问题解决及时生态丰富与大数据工具集成可对接Spark、Dask等分布式计算框架2. 环境准备与安装配置2.1 基础环境要求在开始学习Pandas之前需要确保具备以下环境Python 3.7或更高版本推荐Python 3.8pip包管理工具Python 3.4默认包含代码编辑器或IDE推荐Jupyter Notebook、VS Code、PyCharm2.2 Pandas安装方法Pandas可以通过多种方式安装推荐使用pip安装# 基础安装 pip install pandas # 如果用于数据分析建议安装完整的数据科学套件 pip install pandas numpy matplotlib jupyter # 使用清华镜像源加速安装国内用户 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple对于Anaconda用户Pandas已经预装在环境中# 检查是否已安装 conda list pandas # 如果需要安装或更新 conda install pandas # 或 conda update pandas2.3 验证安装结果安装完成后可以通过以下代码验证Pandas是否正常工作import pandas as pd import numpy as np print(fPandas版本: {pd.__version__}) print(fNumPy版本: {np.__version__}) # 创建一个简单的DataFrame测试 df pd.DataFrame({A: [1, 2, 3], B: [4, 5, 6]}) print(测试DataFrame:) print(df)预期输出Pandas版本: 1.5.3 NumPy版本: 1.23.5 测试DataFrame: A B 0 1 4 1 2 5 2 3 62.4 Jupyter Notebook环境配置对于数据分析工作推荐使用Jupyter Notebook# 安装Jupyter pip install jupyter # 启动Jupyter Notebook jupyter notebook在Notebook中可以分段执行代码实时查看结果非常适合数据探索和分析工作。3. Pandas核心数据结构详解3.1 Series一维带标签数组Series是Pandas中最基本的数据结构类似于一维数组或列表但带有索引标签。# 创建Series的多种方式 import pandas as pd # 从列表创建 s1 pd.Series([1, 3, 5, 7, 9]) print(从列表创建:) print(s1) # 从列表创建并指定索引 s2 pd.Series([10, 20, 30], index[a, b, c]) print(\n指定索引的Series:) print(s2) # 从字典创建字典的键自动成为索引 s3 pd.Series({北京: 2154, 上海: 2428, 深圳: 1756}) print(\n从字典创建:) print(s3) # Series的基本属性 print(f\nSeries的值: {s2.values}) print(fSeries的索引: {s2.index}) print(fSeries的形状: {s2.shape}) print(fSeries的数据类型: {s2.dtype})3.2 DataFrame二维表格数据结构DataFrame是Pandas中最常用的数据结构类似于Excel表格或SQL表。# 创建DataFrame的多种方式 # 从字典创建最常用 data { 姓名: [张三, 李四, 王五, 赵六], 年龄: [25, 30, 35, 28], 城市: [北京, 上海, 广州, 深圳], 薪资: [15000, 18000, 22000, 16000] } df pd.DataFrame(data) print(基本DataFrame:) print(df) # 从列表的列表创建 data_list [[张三, 25, 北京, 15000], [李四, 30, 上海, 18000], [王五, 35, 广州, 22000]] df2 pd.DataFrame(data_list, columns[姓名, 年龄, 城市, 薪资]) print(\n从列表创建:) print(df2) # 从CSV文件创建实际工作中最常用 # df pd.read_csv(data.csv)3.3 DataFrame核心操作DataFrame提供了丰富的数据操作方法# 查看数据基本信息 print(DataFrame形状:, df.shape) print(数据概览:) print(df.info()) print(\n描述性统计:) print(df.describe()) # 数据选取 print(\n前2行数据:) print(df.head(2)) print(\n选取姓名列:) print(df[姓名]) print(\n选取多列:) print(df[[姓名, 薪资]]) # 条件筛选 print(\n薪资大于17000的员工:) print(df[df[薪资] 17000]) print(\n北京地区的员工:) print(df[df[城市] 北京])4. 数据读取与导出实战4.1 常见数据格式读取Pandas支持多种数据格式的读取# 读取CSV文件 # df_csv pd.read_csv(data.csv, encodingutf-8) # 读取Excel文件 # df_excel pd.read_excel(data.xlsx, sheet_nameSheet1) # 读取JSON文件 # df_json pd.read_json(data.json) # 读取SQL数据库 # import sqlite3 # conn sqlite3.connect(database.db) # df_sql pd.read_sql_query(SELECT * FROM table_name, conn) # 演示用示例数据 df_demo pd.DataFrame({ 产品: [A, B, C, D], 销量: [100, 150, 80, 200], 价格: [25.5, 30.0, 15.8, 40.2], 日期: pd.date_range(2023-01-01, periods4) }) print(示例数据:) print(df_demo)4.2 数据导出操作将处理好的数据保存到文件# 保存为CSV df_demo.to_csv(output.csv, indexFalse, encodingutf-8-sig) # 保存为Excel df_demo.to_excel(output.xlsx, indexFalse) # 保存为JSON df_demo.to_json(output.json, orientrecords, force_asciiFalse) print(数据导出完成) # 验证导出结果 df_verify pd.read_csv(output.csv) print(验证读取的CSV数据:) print(df_verify)4.3 读取参数详解实际工作中经常需要调整读取参数# 带参数的读取示例 # df pd.read_csv(data.csv, # encodinggbk, # 编码格式 # header0, # 表头行 # sep,, # 分隔符 # skiprows1, # 跳过行 # nrows1000, # 读取行数 # na_values[NULL, ]) # 缺失值标识5. 数据清洗与预处理5.1 缺失值处理缺失值是数据清洗中最常见的问题# 创建包含缺失值的示例数据 import numpy as np df_missing pd.DataFrame({ A: [1, 2, np.nan, 4], B: [5, np.nan, np.nan, 8], C: [10, 11, 12, 13] }) print(原始数据含缺失值:) print(df_missing) # 检查缺失值 print(\n缺失值统计:) print(df_missing.isnull().sum()) print(\n缺失值位置:) print(df_missing.isnull()) # 缺失值处理方式 print(\n删除含有缺失值的行:) print(df_missing.dropna()) print(\n用均值填充缺失值:) print(df_missing.fillna(df_missing.mean())) print(\n用前向填充:) print(df_missing.fillna(methodffill)) # 实际项目中的缺失值处理策略 def handle_missing_data(df): 综合缺失值处理函数 # 删除缺失值超过50%的列 threshold len(df) * 0.5 df_cleaned df.dropna(axis1, threshthreshold) # 数值列用中位数填充 numeric_cols df_cleaned.select_dtypes(include[np.number]).columns df_cleaned[numeric_cols] df_cleaned[numeric_cols].fillna( df_cleaned[numeric_cols].median() ) # 分类列用众数填充 categorical_cols df_cleaned.select_dtypes(include[object]).columns for col in categorical_cols: df_cleaned[col] df_cleaned[col].fillna(df_cleaned[col].mode()[0]) return df_cleaned5.2 重复值处理重复数据会影响分析结果的准确性# 创建包含重复值的示例数据 df_duplicate pd.DataFrame({ 姓名: [张三, 李四, 张三, 王五, 李四], 年龄: [25, 30, 25, 35, 30], 部门: [技术部, 销售部, 技术部, 人事部, 销售部] }) print(原始数据含重复值:) print(df_duplicate) # 检查重复值 print(\n重复行统计:) print(df_duplicate.duplicated().sum()) print(\n标记重复行:) print(df_duplicate[df_duplicate.duplicated()]) # 处理重复值 print(\n删除重复行:) df_dedup df_duplicate.drop_duplicates() print(df_dedup) # 基于特定列去重 print(\n基于姓名列去重保留第一个:) df_dedup_name df_duplicate.drop_duplicates(subset[姓名]) print(df_dedup_name)5.3 数据类型转换正确的数据类型是数据分析的基础# 数据类型转换示例 df_types pd.DataFrame({ 字符串数字: [100, 200, 300], 日期字符串: [2023-01-01, 2023-01-02, 2023-01-03], 布尔字符串: [True, False, True] }) print(原始数据类型:) print(df_types.dtypes) # 类型转换 df_types[字符串数字] df_types[字符串数字].astype(int) df_types[日期字符串] pd.to_datetime(df_types[日期字符串]) df_types[布尔字符串] df_types[布尔字符串].map({True: True, False: False}) print(\n转换后数据类型:) print(df_types.dtypes) print(\n转换后数据:) print(df_types)5.4 数据标准化与规范化数据标准化是机器学习预处理的重要步骤# 数据标准化示例 df_scale pd.DataFrame({ 收入: [5000, 8000, 12000, 20000, 15000], 年龄: [25, 35, 28, 42, 31], 工作时长: [8, 10, 9, 12, 11] }) print(原始数据:) print(df_scale) # 最小-最大标准化 from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler() df_scaled pd.DataFrame( scaler.fit_transform(df_scale), columnsdf_scale.columns ) print(\n标准化后数据:) print(df_scaled) # Z-score标准化 from sklearn.preprocessing import StandardScaler std_scaler StandardScaler() df_std pd.DataFrame( std_scaler.fit_transform(df_scale), columnsdf_scale.columns ) print(\nZ-score标准化后数据:) print(df_std)6. 数据分析与统计计算6.1 描述性统计分析描述性统计是了解数据基本情况的第一步# 创建示例销售数据 np.random.seed(42) sales_data pd.DataFrame({ 产品类别: np.random.choice([电子产品, 服装, 食品, 家居], 100), 销售额: np.random.normal(1000, 300, 100), 数量: np.random.randint(1, 50, 100), 利润率: np.random.uniform(0.1, 0.5, 100) }) print(销售数据概览:) print(sales_data.head()) print(\n基本描述性统计:) print(sales_data.describe()) print(\n分类变量描述:) print(sales_data[产品类别].value_counts()) # 分组描述性统计 print(\n按产品类别的销售额统计:) print(sales_data.groupby(产品类别)[销售额].describe())6.2 分组聚合操作分组聚合是数据分析的核心操作# 基本分组聚合 print(按产品类别的平均销售额:) grouped sales_data.groupby(产品类别).agg({ 销售额: [mean, sum, std], 数量: [sum, mean], 利润率: mean }) print(grouped) # 多级分组 sales_data[月份] np.random.choice([1月, 2月, 3月], 100) print(\n按月份和产品类别的分组统计:) multi_grouped sales_data.groupby([月份, 产品类别]).agg({ 销售额: sum, 数量: sum }).round(2) print(multi_grouped) # 使用transform进行分组转换 sales_data[类别平均销售额] sales_data.groupby(产品类别)[销售额].transform(mean) print(\n添加类别平均销售额后的数据:) print(sales_data[[产品类别, 销售额, 类别平均销售额]].head())6.3 数据透视表数据透视表是Excel中常用的功能Pandas也提供了强大支持# 创建数据透视表 pivot_table pd.pivot_table(sales_data, values销售额, index产品类别, columns月份, aggfunc[sum, mean], fill_value0) print(数据透视表:) print(pivot_table) # 更复杂的数据透视表 complex_pivot pd.pivot_table(sales_data, values[销售额, 数量], index产品类别, columns月份, aggfunc{销售额: [sum, mean], 数量: sum}, marginsTrue, # 添加总计行 margins_name总计) print(\n复杂数据透视表:) print(complex_pivot)6.4 时间序列分析Pandas对时间序列分析有很好的支持# 创建时间序列数据 dates pd.date_range(2023-01-01, periods90, freqD) time_series_data pd.DataFrame({ 日期: dates, 销售额: np.random.normal(1000, 200, 90).cumsum(), 访问量: np.random.poisson(500, 90) }) print(时间序列数据:) print(time_series_data.head()) # 时间序列重采样 time_series_data.set_index(日期, inplaceTrue) weekly_data time_series_data.resample(W).agg({ 销售额: sum, 访问量: mean }) print(\n按周重采样数据:) print(weekly_data.head()) # 移动平均计算 time_series_data[7天移动平均] time_series_data[销售额].rolling(window7).mean() print(\n添加移动平均后的数据:) print(time_series_data.head(10))7. 数据可视化集成7.1 基础图表绘制Pandas内置了基于Matplotlib的绘图功能import matplotlib.pyplot as plt import seaborn as sns # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 销售额分布直方图 plt.figure(figsize(12, 8)) plt.subplot(2, 2, 1) sales_data[销售额].hist(bins20, alpha0.7) plt.title(销售额分布) plt.xlabel(销售额) plt.ylabel(频数) # 产品类别销售额柱状图 plt.subplot(2, 2, 2) sales_data.groupby(产品类别)[销售额].mean().plot(kindbar) plt.title(各产品类别平均销售额) plt.xlabel(产品类别) plt.ylabel(平均销售额) # 散点图销售额 vs 数量 plt.subplot(2, 2, 3) plt.scatter(sales_data[数量], sales_data[销售额], alpha0.6) plt.title(销售额与数量关系) plt.xlabel(数量) plt.ylabel(销售额) # 箱线图按产品类别的销售额分布 plt.subplot(2, 2, 4) sales_data.boxplot(column销售额, by产品类别) plt.title(各产品类别销售额分布) plt.tight_layout() plt.show()7.2 高级可视化技巧结合Seaborn库进行更高级的可视化# 使用Seaborn进行高级可视化 plt.figure(figsize(15, 10)) # 热力图相关性分析 plt.subplot(2, 2, 1) correlation_matrix sales_data[[销售额, 数量, 利润率]].corr() sns.heatmap(correlation_matrix, annotTrue, cmapcoolwarm, center0) plt.title(变量相关性热力图) # 小提琴图分布可视化 plt.subplot(2, 2, 2) sns.violinplot(x产品类别, y销售额, datasales_data) plt.title(各产品类别销售额分布) # 折线图时间序列趋势 plt.subplot(2, 2, 3) plt.plot(weekly_data.index, weekly_data[销售额], markero) plt.title(周销售额趋势) plt.xlabel(日期) plt.ylabel(销售额) plt.xticks(rotation45) # 堆积面积图 plt.subplot(2, 2, 4) category_sales sales_data.groupby([月份, 产品类别])[销售额].sum().unstack() category_sales.plot(kindarea, stackedTrue, axplt.gca()) plt.title(各月份产品类别销售额堆积图) plt.xlabel(月份) plt.ylabel(销售额) plt.tight_layout() plt.show()8. 高级数据分析技巧8.1 多表合并与连接实际项目中经常需要合并多个数据源# 创建多个相关表格 customers pd.DataFrame({ 客户ID: [1, 2, 3, 4, 5], 姓名: [张三, 李四, 王五, 赵六, 钱七], 城市: [北京, 上海, 广州, 深圳, 杭州] }) orders pd.DataFrame({ 订单ID: [101, 102, 103, 104, 105], 客户ID: [1, 2, 1, 3, 6], # 注意客户ID 6在customers中不存在 订单金额: [500, 800, 300, 1200, 600], 订单日期: pd.date_range(2023-01-01, periods5) }) print(客户表:) print(customers) print(\n订单表:) print(orders) # 内连接 inner_join pd.merge(customers, orders, on客户ID, howinner) print(\n内连接结果:) print(inner_join) # 左连接 left_join pd.merge(customers, orders, on客户ID, howleft) print(\n左连接结果:) print(left_join) # 外连接 outer_join pd.merge(customers, orders, on客户ID, howouter) print(\n外连接结果:) print(outer_join)8.2 数据重塑技巧数据重塑是数据分析中的重要技能# 创建宽格式数据 wide_data pd.DataFrame({ 城市: [北京, 上海, 广州], 1月: [1000, 1200, 800], 2月: [1100, 1300, 850], 3月: [1050, 1250, 900] }) print(宽格式数据:) print(wide_data) # 宽格式转长格式 long_data pd.melt(wide_data, id_vars[城市], value_vars[1月, 2月, 3月], var_name月份, value_name销售额) print(\n长格式数据:) print(long_data) # 长格式转宽格式 wide_again long_data.pivot(index城市, columns月份, values销售额) print(\n转回宽格式:) print(wide_again)8.3 性能优化技巧处理大数据量时的性能优化# 性能优化示例 import time # 创建大数据集 large_df pd.DataFrame({ A: np.random.rand(1000000), B: np.random.rand(1000000), C: np.random.choice([X, Y, Z], 1000000) }) # 普通循环慢 start_time time.time() result_slow [] for i in range(len(large_df)): if large_df.loc[i, A] 0.5: result_slow.append(large_df.loc[i, B] * 2) else: result_slow.append(large_df.loc[i, B]) slow_time time.time() - start_time # 向量化操作快 start_time time.time() result_fast np.where(large_df[A] 0.5, large_df[B] * 2, large_df[B]) fast_time time.time() - start_time print(f普通循环耗时: {slow_time:.4f}秒) print(f向量化操作耗时: {fast_time:.4f}秒) print(f性能提升: {slow_time/fast_time:.1f}倍) # 使用query方法优化筛选 start_time time.time() filtered_slow large_df[large_df[A] 0.5] slow_time time.time() - start_time start_time time.time() filtered_fast large_df.query(A 0.5) fast_time time.time() - start_time print(f\n布尔索引耗时: {slow_time:.4f}秒) print(fquery方法耗时: {fast_time:.4f}秒)9. 实战案例电商数据分析9.1 案例背景与数据准备通过一个完整的电商数据分析案例综合运用Pandas各项功能# 创建电商数据集 np.random.seed(123) n_records 1000 ecommerce_data pd.DataFrame({ 订单ID: range(1, n_records 1), 用户ID: np.random.randint(1001, 1100, n_records), 产品类别: np.random.choice([电子产品, 服装, 家居, 美妆, 食品], n_records), 销售额: np.random.normal(150, 50, n_records), 数量: np.random.randint(1, 10, n_records), 评分: np.random.randint(1, 6, n_records), 购买日期: pd.date_range(2023-01-01, periodsn_records, freqH), 城市: np.random.choice([北京, 上海, 广州, 深圳, 杭州, 成都], n_records) }) # 添加一些异常值和缺失值 ecommerce_data.loc[10:15, 销售额] np.nan ecommerce_data.loc[20:25, 评分] 10 # 异常评分 print(电商数据概览:) print(ecommerce_data.head()) print(f\n数据形状: {ecommerce_data.shape}) print(\n数据信息:) print(ecommerce_data.info())9.2 数据清洗与探索对电商数据进行全面的清洗和探索# 数据清洗函数 def clean_ecommerce_data(df): 电商数据清洗 df_clean df.copy() # 处理缺失值 df_clean[销售额] df_clean[销售额].fillna(df_clean[销售额].median()) # 处理异常值 df_clean df_clean[df_clean[评分] 5] # 添加衍生特征 df_clean[客单价] df_clean[销售额] / df_clean[数量] df_clean[购买月份] df_clean[购买日期].dt.month df_clean[购买小时] df_clean[购买日期].dt.hour return df_clean cleaned_data clean_ecommerce_data(ecommerce_data) print(清洗后数据形状:, cleaned_data.shape) # 探索性分析 print(\n各产品类别销售情况:) category_analysis cleaned_data.groupby(产品类别).agg({ 销售额: [sum, mean, count], 评分: mean, 客单价: mean }).round(2) print(category_analysis) print(\n各城市销售情况:) city_analysis cleaned_data.groupby(城市).agg({ 销售额: sum, 订单ID: count, 客单价: mean }).rename(columns{订单ID: 订单数量}).round(2) print(city_analysis)9.3 深入业务分析基于业务需求进行深入分析# 用户行为分析 user_analysis cleaned_data.groupby(用户ID).agg({ 订单ID: count, 销售额: sum, 评分: mean }).rename(columns{ 订单ID: 购买次数, 销售额: 总消费金额 }).round(2) print(用户购买行为分析:) print(user_analysis.describe()) # RFM分析用户分群 rfm_data cleaned_data.groupby(用户ID).agg({ 购买日期: max, # 最近购买时间 订单ID: count, # 购买频率 销售额: sum # 购买金额 }).rename(columns{ 购买日期: 最近购买, 订单ID: 购买频率, 销售额: 购买金额 }) # 计算RFM分数 rfm_data[R_分数] (rfm_data[最近购买].max() - rfm_data[最近购买]).dt.days rfm_data[R_分数] pd.qcut(rfm_data[R_分数], 4, labels[4, 3, 2, 1]) rfm_data[F_分数] pd.qcut(rfm_data[购买频率], 4, labels[1, 2, 3, 4]) rfm_data[M_分数] pd.qcut(rfm_data[购买金额], 4, labels[1, 2, 3, 4]) rfm_data[RFM_分数] rfm_data[R_分数].astype(str) rfm_data[F_分数].astype(str) rfm_data[M_分数].astype(str) print(\nRFM分析结果:) print(rfm_data.head())9.4 时间序列分析分析销售趋势和时间模式# 时间序列分析 time_analysis cleaned_data.set_index(购买日期) # 按小时分析销售趋势 hourly_sales time_analysis.resample(H)[销售额].sum() daily_sales time_analysis.resample(D)[销售额].sum() plt.figure(figsize(15, 10)) # 销售趋势图 plt.subplot(2, 2, 1) daily_sales.plot() plt.title(日销售额趋势) plt.xlabel(日期) plt.ylabel(销售额) # 小时销售分布 plt.subplot(2, 2, 2) hourly_pattern time_analysis.groupby(购买小时)[销售额].sum() hourly_pattern.plot(kindbar) plt.title(各小时销售额分布) plt.xlabel(小时) plt.ylabel(销售额) # 产品类别随时间的变化 plt.subplot(2, 2, 3) category_trend pd.pivot_table(cleaned_data, values销售额, indexcleaned_data[购买日期].dt.date, columns产品类别, aggfuncsum) category_trend.plot(axplt.gca()) plt.title(各产品类别销售趋势) plt.xlabel(日期) plt.ylabel(销售额) plt.legend(bbox_to_anchor(1.05, 1), locupper left) # 评分分布 plt.subplot(2, 2, 4) cleaned_data[评分].value_counts().sort_index().plot(kindbar) plt.title(用户评分分布) plt.xlabel(评分) plt.ylabel(数量) plt.tight_layout() plt.show()10. 常见问题与解决方案10.1 性能优化问题处理大数据量时的常见性能问题及解决方案# 1. 使用合适的数据类型 # 错误做法使用object类型存储类别数据 df_object pd.DataFrame({类别: [A, B, C] * 1000}) print(object类型内存使用:, df_object.memory_usage(deepTrue)[类别]) # 正确做法使用category类型 df_category df_object.astype({类别: category}) print(category类型内存使用:, df_category.memory_usage(deepTrue)[类别]) # 2. 避免链式赋值警告 # 错误做法会产生SettingWithCopyWarning df cleaned_data[cleaned_data[销售额] 100] df[新列] df[销售额] * 2 # 可能产生警告 # 正确做法 df cleaned_data[cleaned_data[销售额] 100].copy() df[新列] df[销售额] * 2 # 3. 使用高效的数据读取方法 # 只读取需要的列 # df pd.read_csv(large_file.csv, usecols[需要的列1, 需要的列2]) # 分块读取大文件 # chunk_size 10000 # chunks pd.read_csv(large_file.csv, chunksizechunk_size) # for chunk in chunks: # process(chunk)10.2 数据清洗难题复杂数据清洗场景的解决方案# 1. 处理复杂缺失值模式 def advanced_missing_value_handling(df): 高级缺失值处理 # 创建缺失值模式标识 df[缺失值模式] df.isnull().sum(axis1) # 对不同模式的缺失值采用不同策略 for col in df.columns: if df[col].isnull().sum() 0: if df[col].dtype in [int64, float64]: # 数值列使用分组中位数填充 df[col] df.groupby(缺失值模式)[col].transform( lambda x: x.fillna(x.median()) ) else: # 分类列使用众数填充 df[col] df.groupby(缺失值模式)[col].transform( lambda x: x.fillna(x.mode()[0] if not x.mode().empty else 未知) ) return df.drop(缺失值模式, axis1) # 2. 异常值检测与处理 def detect_outliers_iqr(df, column): 使用IQR方法检测异常值 Q1 df[column].quantile(0.25) Q3 df[column].quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR outliers df[(df[column] lower_bound) | (df[column] upper_bound)] return outliers, lower_bound, upper_bound # 检测销售额异常值 outliers, lower, upper detect_outliers_iqr(cleaned_data, 销售额) print(f销售额异常值范围: [{lower:.2f}, {upper:.2f}]) print(f检测到{len(outliers)}个异常值)10.3 内存管理技巧大数据量下的内存优化# 内存优化函数 def optimize_memory_usage(df): 优化DataFrame内存使用 df_optimized df.copy() # 优化数值类型 for col in df_optimized.select_dtypes(include[int]).columns: col_min df_optimized[col].min() col_max df_optimized[col].max() if col_min 0: if col_max 255: df_optimized[col] df_optimized[col].astype(uint