Python 数据分析核心库:Pandas 与 NumPy 从入门到实战全指南(附电商用户分析完整代码)

张开发
2026/4/16 21:09:39 15 分钟阅读

分享文章

Python 数据分析核心库:Pandas 与 NumPy 从入门到实战全指南(附电商用户分析完整代码)
目录前言数据科学的双引擎一、Pandas1.1 数据读取与写入1.2 数据探索与清洗1.3 数据转换与聚合1.4 时间序列处理二、NumPy2.1 数组操作2.2 数学运算2.3 线性代数2.4 广播机制三、Pandas 与 NumPy 的协同工作3.1 数据结构转换3.2 性能优化四、实战案例电商用户行为分析4.1 数据准备与加载4.2 核心分析用户行为漏斗与价值分析4.3 可视化呈现洞察的直观表达五、进阶技巧与最佳实践5.1 性能优化技巧5.2 代码规范与可维护性六、总结前言数据科学的双引擎在 Python 数据科学领域Pandas 和 NumPy 就像一对黄金搭档共同构成了数据处理与科学计算的核心基础。NumPy 提供了高效的数组操作和数学函数而 Pandas 则基于 NumPy 构建了更高级的数据结构和数据处理工具。本文将系统梳理这两个库的高频功能通过场景化示例帮助读者快速掌握实战技能。一、Pandas1.1 数据读取与写入Pandas 支持从多种格式读取数据同时能将处理结果输出到不同介质形成完整的数据流转闭环。pd.read_csv()pd.read_excel()pd.read_jason()pd.read_sql()import pandas as pd # 读取不同格式数据 df_csv pd.read_csv(sales_data.csv) # 最常用的CSV格式 df_excel pd.read_excel(财务报表.xlsx, sheet_nameXXXX年数据) # 多sheet处理 df_json pd.read_json(用户行为.json) # 半结构化数据处理 df_sql pd.read_sql(SELECT * FROM user_table WHERE age 18, conn) # 数据库交互df.to_csv()df.to_excel()dfto_jason()# 数据写出注意indexFalse避免写入索引列 df_csv.to_csv(清洗后数据.csv, indexFalse) df_excel.to_excel(汇总报表.xlsx, sheet_name分析结果, indexFalse) df_json.to_json(格式化数据.json, orientrecords) # orient参数控制输出结构应用场景日常业务中从 CSV 读取日志数据进行分析财务场景中处理多 sheet 的 Excel 报表爬虫项目中解析 JSON 格式的 API 返回结果1.2 数据探索与清洗数据清洗是数据分析的前置条件Pandas 提供了一套完整的工具链来探查数据质量并修复问题。df.info()df.describe()# 数据概览快速了解数据结构 print(f数据维度: {df.shape}) # (行数, 列数) print(df.info()) # 查看各列数据类型和非空值情况 print(df.describe()) # 数值列的统计摘要df.fillna()df.dropna()# 缺失值处理三种策略删除、填充、标记 print(缺失值统计:\n, df.isnull().sum()) # 统计每列缺失值 df_clean df.fillna({ 数值列: df[数值列].median(), # 用中位数填充数值列 分类列: 未知类别, # 用默认值填充分类列 时间列: pd.NaT # 标记时间类型缺失 }) df_clean df_clean.dropna(subset[关键列]) # 仅删除关键列有缺失的行# 异常值处理Z-score方法 from scipy import stats z_scores np.abs(stats.zscore(df[销售额])) df_normal df[z_scores 3] # 过滤Z-score绝对值大于3的异常值1.3 数据转换与聚合数据转换是将原始数据转化为分析所需形式的关键步骤Pandas 提供了灵活的转换机制。# 列派生三种创建新列的方式 df[年度销售额] df[月销售额] * 12 # 直接计算 # 函数映射 df[消费等级] df[消费金额].apply( lambda x: 高消费 if x 1000 else 中消费 if x 500 else 低消费) # 向量化条件判断 df[促销标签] np.where( df[购买日期].dt.month.isin([11, 12]), 促销季, 常规季)# 分组聚合数据汇总的核心功能 dept_sales df.groupby(部门)[销售额].sum() # 单分组单指标 dept_analysis df.groupby(部门).agg( 平均销售额(销售额, mean), 最大订单(订单金额, max), 有效客户(客户ID, nunique) # 去重计数 ) # 多指标聚合重命名列pd.pivot_table()# 透视表二维数据汇总 pivot_table pd.pivot_table( df, index地区, columns产品类别, values销售额, aggfuncsum ) # 类似Excel透视表的强大功能1.4 时间序列处理时间序列数据在金融、物联网、日志分析等场景中极为常见Pandas 提供了专业的处理工具。# 时间格式标准化 df[交易时间] pd.to_datetime(df[交易时间], format%Y-%m-%d %H:%M:%S) # 解析多种格式 df.set_index(交易时间, inplaceTrue) # 将时间列设为索引 # 时间特征提取 df[年份] df.index.year df[季度] df.index.quarter df[星期几] df.index.dayofweek # 0-6表示周一到周日 df[是否工作日] ~df.index.dayofweek.isin([5, 6]) # 周末判断 # 时间序列重采样将高频数据聚合为低频 daily_sales df[销售额] monthly_sum daily_sales.resample(M).sum() # 按月求和 weekly_avg daily_sales.resample(W).mean() # 按周求平均 # 时间窗口操作 daily_sales[7日移动平均] daily_sales.rolling(window7).mean() # 短期趋势 daily_sales[30日移动平均] daily_sales.rolling(window30).mean() # 中期趋势二、NumPy2.1 数组操作NumPy 的ndarray数组是其所有功能的基础相比 Python 列表具有更高的内存效率和计算速度。import numpy as np # 数组创建多种创建方式 arr_from_list np.array([1, 3, 5, 7]) # 从列表创建 zeros_arr np.zeros((3, 4)) # 全0数组 ones_arr np.ones((2, 3), dtypeint) # 全1数组指定类型 eye_arr np.eye(3) # 单位矩阵 rand_arr np.random.rand(2, 2) # [0,1)均匀分布随机数 # 数组操作形状与属性 print(f数组形状: {rand_arr.shape}) # (2, 2) print(f维度数量: {rand_arr.ndim}) # 2 print(f元素类型: {rand_arr.dtype}) # float64 reshaped rand_arr.reshape(4, 1) # 改变形状但不改变数据 flattened rand_arr.flatten() # 展平为一维数组 transposed rand_arr.T # 矩阵转置 # 数组连接与分割 a np.array([[1, 2], [3, 4]]) b np.array([[5, 6], [7, 8]]) vstack np.vstack((a, b)) # 垂直堆叠 hstack np.hstack((a, b)) # 水平堆叠 split_arr np.split(hstack, 2, axis1) # 按列分割性能优势数组操作是向量化的避免 Python 循环的性能损耗连续内存布局使得 CPU 缓存利用率更高支持 BLAS/LAPACK 等底层优化库提升计算速度2.2 数学运算NumPy 将大量数学函数向量化实现了高效的数值计算。# 基本算术运算逐元素操作 a np.array([1, 2, 3]) b np.array([4, 5, 6]) add a b # [5, 7, 9] sub a - b # [-3, -3, -3] mul a * b # [4, 10, 18] div a / b # [0.25, 0.4, 0.5] # 矩阵运算线性代数基础 mat_a np.array([[1, 2], [3, 4]]) mat_b np.array([[5, 6], [7, 8]]) dot_product np.dot(mat_a, mat_b) # 矩阵乘法 # 等价于 mat_a mat_bPython 3.5支持 # 统计函数数据描述 data np.array([12, 15, 18, 21, 24]) print(f总和: {np.sum(data)}) # 90 print(f均值: {np.mean(data)}) # 18.0 print(f中位数: {np.median(data)}) # 18.0 print(f标准差: {np.std(data):.2f}) # 4.24 print(f最大值索引: {np.argmax(data)}) # 4对应24 # 条件运算向量化条件判断 arr np.array([-2, 0, 3, -5, 7]) positive np.where(arr 0, arr, 0) # [0, 0, 3, 0, 7] mask arr % 2 0 # 偶数掩码 even_numbers arr[mask] # [ -2, 0]2.3 线性代数NumPy 的线性代数模块提供了矩阵运算的核心功能是机器学习算法的底层支持。# 矩阵基本运算 mat np.array([[1, 2], [3, 4]]) inv_mat np.linalg.inv(mat) # 矩阵求逆 det_mat np.linalg.det(mat) # 行列式计算 eig_vals, eig_vecs np.linalg.eig(mat) # 特征值与特征向量 # 线性方程组求解 Ax b A np.array([[2, 1], [1, 2]]) b np.array([3, 3]) x np.linalg.solve(A, b) # 解为 [1, 1] # 奇异值分解(SVD) U, S, Vh np.linalg.svd(mat) # 矩阵分解 # 范数计算 norm_1 np.linalg.norm(mat, ord1) # 列范数绝对值列和最大值 norm_inf np.linalg.norm(mat, ordnp.inf) # 行范数绝对值行和最大值2.4 广播机制NumPy 的广播机制允许不同形状的数组进行运算是其灵活性和高效性的重要体现。# 广播示例1向量与标量运算 a np.array([1, 2, 3]) b 2 result a b # [3, 4, 5]标量广播到每个元素 # 广播示例2二维数组与一维数组运算 matrix np.array([[1, 2, 3], [4, 5, 6]]) vector np.array([10, 20, 30]) # vector被广播为[[10,20,30],[10,20,30]] broadcast_result matrix vector # 等价于 # [[110, 220, 330], # [410, 520, 630]] # 广播规则示意图 # matrix形状: (2, 3) # vector形状: (3,) → 广播为 (2, 3) # 结果形状: (2, 3) # 广播示例3不同维度数组运算 arr_3d np.zeros((3, 4, 5)) arr_2d np.ones((4, 5)) sum_result arr_3d arr_2d # 沿第一个维度广播广播规则从后往前比较各维度大小维度大小为 1 或相等时可以广播维度大小不同时将较小的维度扩展为较大的维度大小广播会隐式创建虚拟副本不实际占用内存三、Pandas 与 NumPy 的协同工作3.1 数据结构转换Pandas 的数据结构本质上是对 NumPy 数组的封装两者可以自由转换。# Pandas到NumPy df pd.DataFrame({ A: [1, 2, 3], B: [4, 5, 6] }) numpy_array df.values # 将DataFrame转为NumPy数组 series_array df[A].to_numpy() # 将Series转为NumPy数组 # NumPy到Pandas new_df pd.DataFrame(numpy_array, columns[X, Y]) # 数组转DataFrame new_series pd.Series(series_array, name数值列) # 数组转Series # 混合使用示例 # 用NumPy生成随机数据再用Pandas处理 random_data np.random.randn(100, 3) df pd.DataFrame( random_data, columns[特征1, 特征2, 目标值] ) # 使用Pandas进行数据清洗 cleaned_data df.dropna() # 再用NumPy进行数值计算 mean_values np.mean(cleaned_data.values, axis0)3.2 性能优化在实际项目中合理结合 Pandas 和 NumPy 可以大幅提升性能。# 案例大型数据的分组统计优化 # 传统Pandas方法较慢 def pandas_method(df): return df.groupby(分组列)[数值列].sum() # 优化方法先转NumPy再分组更快 def numpy_optimized(df): groups df[分组列].to_numpy() values df[数值列].to_numpy() unique_groups np.unique(groups) results np.zeros_like(unique_groups, dtypefloat) for i, group in enumerate(unique_groups): results[i] np.sum(values[groups group]) return pd.Series(results, indexunique_groups, name数值列_sum) # 性能对比数据量越大优势越明显 large_df pd.DataFrame({ 分组列: np.random.choice(1000, size1000000), 数值列: np.random.randn(1000000) }) %timeit pandas_method(large_df) # 传统方法耗时较长 %timeit numpy_optimized(large_df) # 优化方法耗时显著减少优化原则对不需要索引的数据转为 NumPy 数组处理更高效复杂的数值计算尽量使用 NumPy 向量化操作大型数据的分组聚合可考虑 NumPy 的直接计算涉及矩阵运算时优先使用 NumPy 的线性代数函数四、实战案例电商用户行为分析4.1 数据准备与加载# 假设我们有电商用户行为数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 模拟生成数据实际项目中从文件读取 np.random.seed(42) # 保证结果可复现 n_samples 10000 # 生成基础数据 user_ids np.random.randint(1000, 9999, n_samples) item_ids np.random.randint(100, 999, n_samples) timestamps pd.date_range(2024-01-01, 2024-12-31, periodsn_samples) actions np.random.choice([浏览, 加购, 下单, 支付], n_samples) prices np.random.normal(100, 50, n_samples).clip(10, 500).astype(int) # 创建DataFrame df pd.DataFrame({ 用户ID: user_ids, 商品ID: item_ids, 时间戳: timestamps, 行为类型: actions, 价格: prices }) # 数据预处理 df[月份] df[时间戳].dt.month df[是否促销月] df[月份].isin([6, 11]) # 假设618和双11是促销月4.2 核心分析用户行为漏斗与价值分析# 1. 构建用户行为漏斗 funnel df.groupby([用户ID, 行为类型])[商品ID].count().unstack(fill_value0) # 计算各行为转化率 funnel[浏览-加购转化率] funnel[加购] / funnel[浏览] funnel[加购-下单转化率] funnel[下单] / funnel[加购] funnel[下单-支付转化率] funnel[支付] / funnel[下单] # 2. 计算用户价值RFM模型 # 最近消费(Recency)最后一次消费距离今天的天数 rfm df.groupby(用户ID)[时间戳].max().reset_index() rfm[最近消费天数] (pd.Timestamp(2024-12-31) - rfm[时间戳]).dt.days # 消费频率(Frequency)统计下单次数 freq df[df[行为类型] 下单].groupby(用户ID)[行为类型].count().reset_index() freq.columns [用户ID, 消费频率] rfm pd.merge(rfm, freq, on用户ID, howleft).fillna(0) # 消费金额(Monetary)统计消费总额 monetary df[df[行为类型] 支付].groupby(用户ID)[价格].sum().reset_index() monetary.columns [用户ID, 消费金额] rfm pd.merge(rfm, monetary, on用户ID, howleft).fillna(0) # 3. 促销月效果分析 promotion_effect df.groupby([是否促销月, 行为类型])[商品ID].count().unstack() promotion_effect[行为增长比] promotion_effect[True] / promotion_effect[False] - 14.3 可视化呈现洞察的直观表达# 1. 月度销售趋势 monthly_sales df[df[行为类型] 支付].groupby(月份)[价格].sum() plt.figure(figsize(12, 6)) plt.plot(monthly_sales.index, monthly_sales.values, markero, colorblue) plt.title(2024年月度销售总额趋势) plt.xlabel(月份) plt.ylabel(销售总额(元)) plt.grid(True, linestyle--, alpha0.7) plt.xticks(monthly_sales.index) plt.tight_layout() # 2. 用户价值分布 plt.figure(figsize(15, 5)) plt.subplot(1, 3, 1) plt.hist(rfm[最近消费天数], bins20, colorgreen, alpha0.7) plt.title(用户最近消费天数分布) plt.xlabel(距离最后消费的天数) plt.ylabel(用户数) plt.subplot(1, 3, 2) plt.hist(rfm[消费频率], bins20, colororange, alpha0.7) plt.title(用户消费频率分布) plt.xlabel(消费次数) plt.ylabel(用户数) plt.subplot(1, 3, 3) plt.hist(rfm[消费金额], bins20, colorred, alpha0.7) plt.title(用户消费金额分布) plt.xlabel(消费总额(元)) plt.ylabel(用户数) plt.tight_layout() # 3. 促销月行为增长 promotion_effect[行为增长比].plot(kindbar, colorpurple, alpha0.8) plt.title(促销月各行为增长比例) plt.ylabel(增长倍数) plt.axhline(y0, colork, linestyle-) plt.tight_layout()五、进阶技巧与最佳实践5.1 性能优化技巧1、向量化操作优先避免使用 Python 循环尽量用 Pandas 的apply()或 NumPy 的向量化函数替代2、数据类型优化使用df.astype()将数值列转为合适的类型如int8替代int643、内存映射文件处理大型数据时使用pd.read_csv(..., chunksize...)分块读取4、NumPy 数组替代对纯数值计算将 Pandas 数据转为 NumPy 数组处理更高效5.2 代码规范与可维护性1、函数封装将常用数据处理流程封装为函数如data_cleaning()、feature_engineering()2、文档字符串为关键函数添加 Google 风格文档字符串说明参数、返回值和示例3、项目结构按功能模块组织代码如data_loader.py、data_analyzer.py4、版本控制使用 Git 管理代码版本重要节点添加清晰的提交说明六、总结掌握 Pandas 和 NumPy 不仅是学会两个 Python 库的使用更是培养数据思维和科学计算思维的过程Pandas教会如何处理结构化数据的清洗、转换与分析构建数据处理的完整流程NumPy教会如何进行高效的数值计算理解向量化思维和矩阵运算的数学本质在实际数据科学项目中这两个库通常与 Matplotlib可视化、Scikit-learn机器学习等库配合使用形成完整的技术栈。

更多文章