ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Pandas 数据分析实战指南

Pandas 数据分析实战指南 1. Pandas 简介Pandas 是 Python 生态中最常用的数据分析库之一提供高性能、易用的数据结构和数据分析工具。它的核心数据结构包括 Series一维数据和 DataFrame二维表格数据广泛应用于数据清洗、转换、分析和可视化等场景。2. 安装与导入使用 pip 即可完成安装pip install pandas导入 Pandas 的惯例写法如下import pandas as pd3. 核心数据结构3.1 SeriesSeries 是带标签的一维数组可以保存任意数据类型。创建 Series 的示例import pandas as pd s pd.Series([10, 20, 30, 40], index[a, b, c, d]) print(s)3.2 DataFrameDataFrame 是二维表格数据结构由行和列组成是 Pandas 中最常用的对象。创建 DataFrame 的示例import pandas as pd data { 姓名: [张三, 李四, 王五], 年龄: [25, 30, 35], 城市: [北京, 上海, 广州] } df pd.DataFrame(data) print(df)4. 数据读取与写入Pandas 支持读写多种格式的数据文件最常用的是 CSV 和 Excelimport pandas as pd 读取 CSV 文件 df pd.read_csv(data.csv) 读取 Excel 文件 df pd.read_excel(data.xlsx, sheet_nameSheet1) 写入 CSV 文件 df.to_csv(output.csv, indexFalse) 写入 Excel 文件 df.to_excel(output.xlsx, indexFalse)5. 数据查看与基础操作掌握常用的数据查看方法可以快速了解数据全貌import pandas as pd df pd.read_csv(data.csv) 查看前 5 行 print(df.head()) 查看数据基本信息 print(df.info()) 查看描述性统计 print(df.describe()) 选择单列 print(df[列名]) 选择多列 print(df[[列名1, 列名2]]) 按条件筛选 print(df[df[年龄] 30])6. 数据清洗真实数据往往包含缺失值、重复值等问题需要先进行清洗import pandas as pd df pd.read_csv(data.csv) 查看缺失值 print(df.isnull().sum()) 删除包含缺失值的行 df_clean df.dropna() 填充缺失值 df_filled df.fillna(0) 删除重复行 df_unique df.drop_duplicates() 重命名列 df df.rename(columns{旧列名: 新列名})7. 数据分组与聚合groupby 是数据分析中最常用的操作之一可以按某个或多个列分组后进行聚合计算import pandas as pd df pd.read_csv(data.csv) 按单列分组并计算均值 result df.groupby(城市)[年龄].mean() print(result) 按多列分组并计算多个统计量 result df.groupby([城市, 性别]).agg({ 年龄: [mean, max, min], 收入: sum }) print(result)8. 数据合并与连接当数据分散在多个表中时需要使用合并操作将它们整合import pandas as pd df1 pd.DataFrame({ID: [1, 2, 3], 姓名: [张三, 李四, 王五]}) df2 pd.DataFrame({ID: [1, 2, 4], 城市: [北京, 上海, 深圳]}) 内连接取交集 inner pd.merge(df1, df2, onID, howinner) print(inner) 左连接保留左表全部 left pd.merge(df1, df2, onID, howleft) print(left) 纵向拼接 df3 pd.DataFrame({ID: [5], 姓名: [赵六]}) concat pd.concat([df1, df3], ignore_indexTrue) print(concat)9. 时间序列处理Pandas 对时间序列数据提供了强大的支持import pandas as pd 创建日期范围 dates pd.date_range(2024-01-01, periods10, freqD) print(dates) 将字符串列转换为日期类型 df[日期] pd.to_datetime(df[日期]) 设置日期为索引 df df.set_index(日期) 按月份重采样并求和 monthly df.resample(M).sum() print(monthly)10. 实战案例销售数据分析下面通过一个完整的案例综合运用前面介绍的知识点import pandas as pd 模拟销售数据 data { 日期: pd.date_range(2024-01-01, periods100, freqD), 城市: [北京, 上海, 广州, 深圳] * 25, 销售额: [1200, 1500, 980, 1350] * 25, 订单数: [12, 15, 9, 13] * 25 } df pd.DataFrame(data) 查看数据概况 print(df.info()) # 输出示例 # class pandas.core.frame.DataFrame # RangeIndex: 100 entries, 0 to 99 # Data columns (total 4 columns): # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 日期 100 non-null datetime64[ns] # 1 城市 100 non-null object # 2 销售额 100 non-null int64 # 3 订单数 100 non-null int64 # dtypes: datetime64[ns](1), int64(2), object(1) # memory usage: 3.2 KB print(df.describe()) # 输出示例 # 销售额 订单数 # count 100.000000 100.000000 # mean 1257.500000 12.250000 # std 198.412698 2.015564 # min 980.000000 9.000000 # 25% 1200.000000 12.000000 # 50% 1250.000000 12.500000 # 75% 1350.000000 13.000000 # max 1500.000000 15.000000 按城市分组统计 city_stats df.groupby(城市)[销售额].agg([sum, mean, max]) print(city_stats) # 输出示例 # sum mean max # 城市 # 北京 30000 1200.0 1200 # 上海 37500 1500.0 1500 # 广州 24500 980.0 980 # 深圳 33750 1350.0 1350 按月统计销售额趋势 df[月份] df[日期].dt.month monthly_trend df.groupby(月份)[销售额].sum() print(monthly_trend) # 输出示例 # 月份 # 1 38750 # 2 35000 # 3 38750 # 4 37500 # Name: 销售额, dtype: int64 筛选销售额最高的城市 top_city city_stats[sum].idxmax() print(f销售额最高的城市{top_city}) # 输出示例 # 销售额最高的城市上海 使用 matplotlib 绘制各城市销售额对比柱状图 import matplotlib.pyplot as plt # 设置中文字体避免图表中文乱码 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 从 city_stats 中提取各城市销售额总和 city_sales city_stats[sum] # 绘制柱状图 plt.figure(figsize(8, 5)) plt.bar(city_sales.index, city_sales.values, color[#4C72B0, #55A868, #C44E52, #8172B2]) plt.title(各城市销售额对比) plt.xlabel(城市) plt.ylabel(销售额) # 在柱子上方标注数值 for i, v in enumerate(city_sales.values): plt.text(i, v 500, str(v), hacenter, vabottom) # 调用 plt.show() 显示图表在 Jupyter Notebook 中也可直接显示 plt.show()从柱状图中可以直观看出上海的总销售额最高广州最低。这说明不同城市的销售表现存在明显差异后续可以针对低销售额城市制定专项促销策略同时保持上海等优势城市的稳定增长。11. 常见错误与排查在实际使用 Pandas 的过程中经常会遇到一些典型报错。下面列举几种常见问题并给出原因分析和解决方案。11.1 KeyError列名不存在当使用不存在的列名访问 DataFrame 时会抛出 KeyError。常见原因是列名拼写错误或者列名包含空格、大小写不一致。import pandas as pd df pd.DataFrame({姓名: [张三, 李四], 年龄: [25, 30]}) 错误写法列名拼写错误 print(df[姓 名]) 正确写法使用准确的列名 print(df[姓名]) 查看所有列名避免拼写错误 print(df.columns)11.2 SettingWithCopyWarning链式赋值警告当对 DataFrame 切片后的副本进行赋值时Pandas 会发出 SettingWithCopyWarning。这通常不是错误但可能导致修改未生效需要避免链式赋值。import pandas as pd df pd.DataFrame({姓名: [张三, 李四], 年龄: [25, 30]}) 触发警告的写法先切片再赋值 df[df[年龄] 26][城市] 北京 推荐写法使用 .loc 直接定位并赋值 df.loc[df[年龄] 26, 城市] 北京 print(df)11.3 内存不足数据量过大当读取超大文件或进行复杂计算时可能因内存不足而报错。可以通过分块读取、按需选择列、调整数据类型等方式降低内存占用。import pandas as pd 分块读取大文件避免一次性载入全部数据 chunk_iter pd.read_csv(large_data.csv, chunksize10000) total 0 for chunk in chunk_iter: total chunk[销售额].sum() print(f总销售额{total}) 只读取需要的列减少内存占用 df pd.read_csv(large_data.csv, usecols[日期, 销售额]) 将整数列转换为更紧凑的类型 df[订单数] df[订单数].astype(int32)11.4 日期解析失败格式不匹配当字符串列无法按默认格式解析为日期时会抛出异常。需要显式指定日期格式或使用 errors 参数处理无效数据。import pandas as pd df pd.DataFrame({日期: [2024-01-01, 2024/01/02, 无效日期]}) 指定格式解析并将无法解析的值设为 NaT df[日期] pd.to_datetime(df[日期], format%Y-%m-%d, errorscoerce) print(df)11.5 合并时键不匹配数据错位使用 merge 合并时如果连接键的数据类型不一致或存在重复值可能导致结果行数异常。建议先检查键的数据类型和唯一性。import pandas as pd df1 pd.DataFrame({ID: [1, 2, 3], 姓名: [张三, 李四, 王五]}) df2 pd.DataFrame({ID: [1, 2, 4], 城市: [北京, 上海, 深圳]}) 错误写法键类型不一致导致匹配失败 result pd.merge(df1, df2, onID) 正确写法先将键统一为相同类型 df2[ID] df2[ID].astype(int) result pd.merge(df1, df2, onID, howleft) print(result)12. 性能优化建议在处理大规模数据时合理的性能优化可以显著提升运行效率并降低内存占用。下面介绍几个常用的优化技巧。12.1 使用向量化操作替代 for 循环Pandas 的向量化操作基于底层 C 语言实现执行效率远高于 Python 的 for 循环。应尽量使用向量化运算避免逐行遍历。import pandas as pd df pd.DataFrame({销售额: [1200, 1500, 980, 1350]}) 使用 for 循环逐行计算效率低 df[折扣价] 0 for i in range(len(df)): df.loc[i, 折扣价] df.loc[i, 销售额] * 0.9 print(df) 使用向量化运算效率高 df[折扣价] df[销售额] * 0.9 print(df) 使用 apply 逐行处理适合复杂逻辑但速度慢于向量化 df[折扣价] df[销售额].apply(lambda x: x * 0.9) print(df)12.2 使用 .loc 替代链式赋值链式赋值容易触发 SettingWithCopyWarning且可能修改未生效。推荐使用 .loc 直接定位并赋值既安全又高效。import pandas as pd df pd.DataFrame({姓名: [张三, 李四, 王五], 年龄: [25, 30, 35]}) 不推荐链式赋值可能触发警告且修改不生效 df[df[年龄] 26][城市] 北京 推荐使用 .loc 直接定位并赋值 df.loc[df[年龄] 26, 城市] 北京 print(df)12.3 合理设置数据类型以节省内存Pandas 默认使用 int64 和 float64 存储数值对于取值范围较小的列可以转换为更紧凑的类型来降低内存占用。import pandas as pd df pd.DataFrame({订单数: [12, 15, 9, 13], 价格: [99.5, 120.0, 88.8, 150.2]}) 查看各列数据类型 print(df.dtypes) 将整数列转换为 int32节省内存 df[订单数] df[订单数].astype(int32) 将浮点列转换为 float32节省内存 df[价格] df[价格].astype(float32) print(df.dtypes)12.4 使用 chunksize 分块处理大文件当文件过大无法一次性载入内存时可以使用 chunksize 分块读取逐块处理并汇总结果。import pandas as pd 分块读取大文件避免内存溢出 chunk_iter pd.read_csv(large_data.csv, chunksize10000) total 0 for chunk in chunk_iter: total chunk[销售额].sum() print(f总销售额{total}) 也可以只读取需要的列进一步减少内存占用 chunk_iter pd.read_csv(large_data.csv, chunksize10000, usecols[日期, 销售额]) for chunk in chunk_iter: print(chunk.head())13. 总结Pandas 是 Python 数据分析的核心工具掌握 Series、DataFrame、数据清洗、分组聚合、合并连接和时间序列处理等核心能力可以高效完成绝大多数数据分析任务。建议结合实际业务数据多加练习逐步提升数据处理效率。
返回列表