拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Python-100-Days 番外篇:按数据分析流程快速驾驭 pandas 库——三大核心类型与六阶段方法论

Python-100-Days 番外篇:按数据分析流程快速驾驭 pandas 库——三大核心类型与六阶段方法论
  • 文档
  • 教程

【免费下载链接】Python-100-Days

Python - 100天从新手到大师

项目地址:https://gitcode.com/GitHub_Trending/py/Python-100-Days
点击查看免费下载

本篇技术指南围绕 Python 数据科学生态中的核心库pandas,系统梳理其三大核心类型(Series、DataFrame、Index)以及「数据获取 → 数据重塑 → 数据清洗 → 数据透视 → 数据呈现」的完整分析流程。文章以 番外篇/如何快速驾驭 pandas 库.md 为骨架,并结合当前仓库 Day66-80 中「深入浅出 pandas」系列教程(Day72~Day77)与配套 Notebook 代码进行源码级佐证。读完本文,你将掌握 pandas 最常用的函数与方法清单、每个核心参数的含义与默认值,以及一套「按流程学函数」的高效学习路径——无论是自学还是直接用它们完成一次真实的数据分析任务,都能少走弯路。

很多初学者面对 pandas 时最大的困惑是:函数和方法太多,不知道从哪儿学起、更不知道什么时候该用哪个。要解决这个问题,最有效的做法不是逐个背 API,而是按数据分析的流程来组织知识——每个阶段只掌握该阶段最常用的几个函数,使用时按流程「对号入座」。本仓库在 Day72 - 深入浅出pandas-1 至 Day77 - 深入浅出pandas-6 中对该思路做了完整落地,本文则给出浓缩版「速查手册」。

三个核心类:理解 pandas 的数据模型

pandas 库有三个最核心的类,其中最重要的是DataFrame类型,它是学习的重点。在 Day72 - 深入浅出pandas-1 中同样强调:pandas 以 NumPy 为基础实现数据存储和运算,核心数据类型正是Series(数据系列)、DataFrame(数据框),外加一个为二者提供索引服务的Index类型及其子类型。

  1. Series:表示一维数据,跟一维数组类似(带标签的数组),每个数据都有自己的索引(标签),可以通过索引访问数据。从源码结构看,Series内部包含两个数组——一个保存数据、一个保存索引。例如 Day66-80/72.深入浅出pandas-1.md 中通过列表加索引、以及通过字典创建Series的写法:
import pandas as pd # 通过列表 + 索引创建 ser1 = pd.Series(data=[120, 380, 250, 360], index=['一季度', '二季度', '三季度', '四季度']) # 通过字典创建(键即索引、值即数据) ser2 = pd.Series({'一季度': 320, '二季度': 180, '三季度': 300, '四季度': 405})
  1. DataFrame:表示二维数据,类似于 Excel 电子表格,行和列都有自己的索引(标签),可以通过索引访问行、列、单元格。日常工作中DataFrame使用最广泛,因为二维结构正好对应有行有列的表格。

  2. Index:表示索引,为Series和DataFrame提供索引服务。Index有很多子类型(如DatetimeIndex、MultiIndex、CategoricalIndex等),适用于需要不同类型索引的场景。

学习建议:把 90% 的精力放在DataFrame上,因为它是二维数据的载体,Series可以看作它的「一列」,Index则是它的「行标签系统」。

数据分析流程:按阶段组织函数的黄金框架

学习和使用 pandas 的重点是DataFrame的应用。建议大家按照数据分析的流程来掌握对应的函数和方法,这样做往往事半功倍。下面的流程图中,蓝色虚线圈中的部分就是可以通过 BI 工具(如 Power BI、Tableau 等)或 Python 程序来完成的部分。

整个流程可以拆解为五个阶段,下面逐一展开,每个阶段给出完整可用的函数签名与参数说明。

阶段一:数据获取(数据加载)

数据获取也可以称为数据加载,其本质就是创建DataFrame对象,需要掌握以下几个函数。

1. 从 CSV 文件加载数据

pd.read_csv是最高频的加载函数,参数众多,下面给出完整清单:

pd.read_csv( filepath, # CSV文件路径(可以本地绝对路径或相对路径,也可以是一个URL) sep, # 字段分隔符(默认是逗号) header, # 表头在第几行 encoding, # 文件编码(默认utf-8) quotechar, # 包裹字符串的符号(默认是双引号) usecols, # 加载哪些列 index_col, # 指定索引列 dtype, # 指定列的数据类型 converters, # 指定列的数据转换器 nrows, # 加载多少行数据 skiprows, # 指定需要跳过的行 parse_dates, # 将哪些列解析为日期时间 date_format, # 日期格式 true_values, # 被视为布尔值True的值 false_values, # 被视为布尔值False的值 na_values, # 被视为空值的值 na_filter, # 是否检测空值标记 on_bad_lines, # 遇到有问题的行如何处理(可选项:'error'、'warn'、'skip') engine, # 指定底层引擎(例如:可以使用更快的Arrow引擎来处理体量更大的数据) iterator, # 是否开启迭代器模式(处理大数据时减少内存开销) chunksize, # 迭代器模式下每次加载数量的体量 )

仓库中的真实用法可以印证这一点。Day66-80/73.深入浅出pandas-2.md 使用北京积分落户数据演示了index_col的用法:

df3 = pd.read_csv('data/2018年北京积分落户数据.csv', index_col='id')

该教程还补充了两个实践细节:读取路径建议使用/作为分隔符;在 Windows 上若必须使用\,建议在字符串前加r使用原始字符串(如r'c:\new\data\xxx.csv'),以避开转义字符。仓库配套的 Notebook Day66-80/code/day04.ipynb 中还有批量读取多个 CSV 并合并的示例:

dfs = [pd.read_csv(os.path.join('res/jobs', filename)) for filename in ...]

2. 从 Excel 文件加载数据

pd.read_excel( io, # 工作簿文件的路径 sheet_name, # 工作表的名字 skip_footer, # 跳过末尾多少行 )

说明:read_excel函数跟read_csv有很多作用相同的参数,这里没有赘述;从 Excel 文件中加载数据时,没有迭代器模式。在 Day66-80/73.深入浅出pandas-2.md 中,一个工作簿内有多个以股票代码命名的工作表,可通过sheet_name指定加载哪个:

df4 = pd.read_excel('data/2022年股票数据.xlsx', sheet_name='AMZN', index_col='Date')

3. 从数据库或数仓加载数据

pd.read_sql( sql, # SQL查询或二维表的名字 con, # 数据库连接 parse_dates, # 指定需要解析成日期的列 index_col, # 指定索隐裂 columns, # 需要加载的列 chunksize, # 加载数据的体量 dtype, # 指定列的数据类型 )

其中的con参数需要传入数据库连接对象,例如 MySQL 场景下可以用pymysql或mysqlclient创建Connection对象后传入,这一用法在 Day66-80/73.深入浅出pandas-2.md 中「读取关系数据库二维表创建DataFrame对象」一节有完整示例。

4. 其他创建 DataFrame 对象的方式

# 方式一:二维列表 + 索引 + 列名 pd.DataFrame(data=[[95, 87], [66, 78], [92, 89]], index=[1001, 1002, 1003], columns=['Verbal', 'Math']) # 方式二:字典(键为列名,值为列数据)+ 索引 pd.DataFrame(data={'Verbal': [95, 66, 92], 'Math': [87, 78, 89]}, index=[1001, 1002, 1003])

创建后必会的查看与访问操作

如果要对DataFrame中的数据或索引进行操作,需要掌握下面的运算和方法。

# 1. 查看信息 df.info() # 2. 查看前/后 N 行 df.head(10) df.tail(5) # 3. 操作列 df['column_name'] df.colume_name # 注意:仅当列名是合法的Python标识符时可用 # 4. 操作行 df.loc['row_index'] # 按标签(索引名)取行 df.iloc[0] # 按整数位置取行 # 5. 操作单元格 df.at['row_index', 'column_name'] # 按标签取单元格 df.iat[0, 0] # 按整数位置取单元格

结构调整:删除、筛选、抽样、索引管理

# 6. 删除行或列 df.drop( labels, # 要删除的行或列的索引 axis, # axis=0,labels表示行索引;axis=1,labels表示列索引 index, # 要删除的行的索引 columns, # 要删除的列的索引 inplace, # 是否就地删除(inplace=True,表示就地删除不返回新DataFrame对象) ) # 7. 筛选数据 df.query(expr) # 通过表达式指定筛选条件 df[bool_index] # 布尔索引 # 8. 随机抽样 df.sampe( n, # 样本容量 frac, # 抽样比例 replace, # 有放回或无放回抽样(默认值False) random_state, # 随机数种子(种子相同每次抽样的结果相同) ) # 9. 重置索引 df.reset_index( level, # 对于多级索引指定重置哪一级的索引 drop, # 是否丢弃索引(drop=False表示索引会被处理成普通列) inplace, # 是否就地处理(要不要返回新的DataFrame对象) ) # 10. 设置索引 df.set_index( keys, # 指定作为索引的列 drop, # 是否删除作为索引的列(默认值True) append, # 是否将指定列加入现有的索引(默认值False) inplace, # 是否就地处理(要不要返回新的DataFrame对象) verify_integrity, # 检查索引列是否存在重复值(默认值False) ) # 11. 调整索引顺序 df.reindex() df[fancy_index] # 花式索引 df.loc[facy_index] # 花式索引 df.iloc[fancy_index] # 花式索引 # 12. 索引排序 df.sort_index( axis, # 确定行索引或列索引(默认值0) level, # 对于多级索引指定索引的级别 ascending, # 升序或降序(默认值True) inplace, # 是否就地排序 kind, # 排序算法(默认值'quicksort') na_position, # 空值放在最前还是最后(默认值'last') key, # 传入比较索引大小的函数(自定义比较规则) )

阶段二:数据重塑(拼接与合并)

数据重塑解决的是「多张表如何组合成一张表」的问题,对应 SQL 中的UNION与JOIN两种语义。

1. 拼接(类似于 SQL 中的 union 操作)

pd.concat( objs, # 保存多个DataFrame对象的容器 axis, # 沿着哪个轴进行拼接 ignore_index, # 是否忽略原来的索引(默认值False) )

Day66-80/74.深入浅出pandas-3.md 中提供了真实示例:读取两张员工表后,直接pd.concat([emp_df, emp2_df])完成纵向拼接,形成完整的员工数据。

2. 合并(类似于 SQL 中的 join 操作)

pd.merge( left, # 左表 right, # 右表 how, # 指定连表的方式(默认值'inner'表示内连接) on, # 指定连表字段(如果左右两表连表字段同名) left_on, # 指定左表的连表字段 right_on, # 指定右表的连表字段 left_index, # 是否使用左表的索引连表 right_index, # 是否使用右表的索引连表 suffixes, # 指定同名列的后缀(默认值('_x', '_y')) )

同样在 Day66-80/74.深入浅出pandas-3.md 中,将员工表与部门表通过how='inner'、on='dno'合并,得到了员工所属部门信息,这就是典型的按外键字段做等值连接。

阶段三:数据清洗(缺失值、重复值、异常值与预处理)

数据清洗是分析流程中最耗时、也最考验经验的一环,重点分四步走:甄别 → 删除/填充 → 预处理。

1. 缺失值处理

# 甄别缺失值 df.isna() df.notna() # 删除缺失值 df.dropna( axis, # 删行或删列(默认值0) how, # 是否存在任意一个缺失值就删除(默认值'any') subset, # 只对哪些行或列删除空值 inplace, # 是否就地删除(要不要返回新的DataFrame对象) ) # 填充缺失值 df.fillna( value, # 填充的值 method, # 填充空值的方法 inplace, # 是否就地填充(要不要返回新的DataFrame对象) ) # 使用插值算法插值 df.interpolate( method, # 插值算法(默认值'linear'表示线性插值法) axis, # 沿着哪个轴插值 inplace, # 是否就地插值(要不要返回新的DataFrame对象) )

Day66-80/74.深入浅出pandas-3.md 对此有详细展开:dropna默认沿 0 轴删除整行,指定axis=1则删除整列;fillna除了指定value,还可以通过method='ffill'用前一个单元格的值填充、method='bfill'用后一个单元格的值填充,例如emp_df.fillna(value=0)将空值统一置为 0。

2. 重复值处理

# 甄别重复值 df.duplicated( subset, # 用于判断重复的列标签 keep, # 如何处理重复项(默认值'first'表示保留第一项) ) # 删除重复值 df.drop_duplicates( subset, # 用于判断重复的列标签 keep, # 如何处理重复项(默认值'first'表示保留第一项) inplace, # 是否就地去重(默认值False) ) # 统计非重复值 df.nunique(axis)

Day66-80/74.深入浅出pandas-3.md 中演示了两种典型场景:dept_df.drop_duplicates('dname')按部门名称去重;而all_emp_df.drop_duplicates(['ename', 'job'], inplace=True)同时以员工姓名和岗位两个字段判断重复并就地删除——注意keep参数可选'first'(保留第一项)、'last'(保留最后一项)或False(重复项全部删除)。

3. 异常值处理

异常值的处理重点在甄别,可以使用数值判定法、z-score 判定法、孤立森林等方法来进行甄别离群点,然后结合实际业务意义判定是不是异常值。对于异常值的处理,通常是替换或删除,删除可以用之前提到的drop方法删行或者删列。

# 替换异常值 df.replace( to_replace, # 被替换的值 value, # 替换的值 inplace, # 是否就地替换(要不要返回新的DataFrame对象) regex, # 是否启动正则表达式替换(默认值False) )

该教程中还给出了批量替换的进阶用法:emp_df.replace({'sal': [1800, 9000], 'comm': 800}, {'sal': avg_sal, 'comm': 1000}),用字典同时指定多个被替换值与对应的替换值。

4. 预处理:Series 上的六大类操作

预处理通常在Series对象上对数据进行操作,假设变量s是一个Series对象。

日期时间预处理:

s.dt.year # 年 s.dt.quarter # 季度 s.dt.month # 月 s.dt.day # 日 s.dt.hour # 时 s.dt.minute # 分 s.dt.second # 秒 s.dt.weekday # 星期几 s.dt.to_period(freq) # 以特定频率转换 s.dt.floor(freq) # 下取整 s.dt.ceil(freq) # 上取整 s.dt.round(freq) # 舍入 s.dt.strftime(date_format) # 格式化 s.dt.tz_localize(tz) # 时区本地化 s.dt.tz_convert(tz) # 转换时区

字符串预处理:

s.str.lower() # 字符串变小写 s.str.upper() # 字符串变大写 s.str.title() # 字符串首字母大写 # 字符串拆分 s.str.split( pat, # 拆分字符或正则表达式 n, # 最大拆分次数 expand, # 是否将拆分后的内容展开成多个列(默认值False) ) # 从字符串中捕获内容 s.str.extract( pat, # 正则表达式 flags, # 正则表达式处理标记 expand, # 是否将捕获内容展开成多个列(默认值True) ) s.str.isalpha() # 检查字符串是不是字母 s.str.isnumeric() # 检查字符串是不是数值 s.str.isalnum() # 检查字符串是不是字母数字 s.str.isspace() # 检查字符串是不是空白字符 s.str.startswith() # 检查字符串是否以指定内容开头 s.str.endswith() # 检查字符串是否以指定内容结尾 # 检查字符串是否跟正则表达式匹配 s.str.match( pat, # 正则表达式 flags, # 正则表达式处理标记 ) # 检查字符串是否包含指定内容 s.str.contains( pat, # 字符串或正则表达式 flags, # 正则表达式处理标记 regex, # 是否使用正则表达式(默认值True) ) # 替换 s.str.replace( pat, # 被替换的内容(字符串或正则表达式) repl, # 替换的内容 n, # 最大替换次数(默认值-1表示全部替换) flags, # 正则表达式处理标记 regex, # 是否使用正则表达式(默认值True) ) s.str.strip() # 去掉字符串多余的空格 s.str.join(sep) # 用指定的分隔符将内容拼接成字符串 # 字符串拼接 s.str.cat( others, # 拼接的内容 sep, # 分隔符 na_rep, # 空值的替代符 ) s.str.len() # 获得字符串长度 # 查找子串的位置 s.str.find( sub, # 子串 start, # 起始位置 end, # 结束位置 )

类别(category)预处理:

# 类别重排序 s.cat.reorder_categories( new_categories, # 新的类别顺序 inplace, # 是否就地处理(默认值False) ) # 添加类别 s.cat.add_categories( new_categories, # 要添加的新类别 inplace, # 是否就地处理(默认值False) ) # 移除类别 s.cat.remove_categories( removals, # 要移除的类别 inplace, # 是否就地处理(默认值False) ) # 移除没有使用的类别 s.cat.remove_unused_categories( inplace, # 是否就地处理(默认值False) ) # 类别重命名 s.cat.rename_categories( new_categories, # 新的类别名称 inplace, # 是否就地处理(默认值False) )

二值化(虚拟变量):机器学习建模前,常把类别型变量转换为 0/1 矩阵。

pd.get_dummies( data, # 需要转换为虚拟变量的Series或DataFrame prefix, # 指定生成的虚拟变量列的前缀 prefix_sep, # 前缀和列名之间的分隔符 dummy_na, # 是否为空值(NaN)生成一个列(默认值False) columns, # 指定要转换的列名 drop_first, # 是否从生成的虚拟变量中删除第一个类别的列(默认值False) )

离散化(分箱):将连续型变量切分为区间,cut按等宽区间切分、qcut按分位数切分。

pd.cut( x, # 要分割的输入数据(一维数据) bins, # 分割的区间数或具体的区间边界 right, # 区间是否包含右端点(默认值False) labels, # 指定每个区间的标签 retbins, # 是否返回分割的边界数组(默认值False) ordered, # 返回的类别是否是有序的(默认值True) ) pd.qcut( x, # 要分割的输入数据(一维数据) q, # 分割点的数量或具体的分位数 labels, # 指定每个区间的标签 retbins, # 是否返回分割的边界数组(默认值False) )

自定义转换:当内置函数无法满足需求时,用map/apply/transform三个方法做灵活的元素级或行列级变换。

s.map(arg) # 对数据进行元素级别的转换和映射 df.map(func) # 对数据进行元素级别的转换和映射 # 通过指定函数对数据进行元素级别的转换(Series) s.apply( func, # 作用于每个元素的函数 convert_type, # 尝试将结果转换为最适合的类型(默认值True) args, # 传递给func的额外位置参数 kwargs, # 传递给func的额外关键字参数 ) # 通过指定函数对数据进行行级或列级的转换(DataFrame) df.apply( func, # 作用域行或列的函数 axis, # 控制做行级还是列级转换 result_type, # 指定返回的类型('expand'表示扩展为列,'reduce'表示返回标量,'broadcast'表示广播为原始形状) args, # 传递给func的额外位置参数 kwargs, # 传递给func的额外关键字参数 ) s.transform(func) # 通过指定一个或多个函数对数据进行元素级别的转换 df.transform(func) # 通过指定一个或多个函数对数据进行行级或列级转换

阶段四:数据透视(统计、聚合与透视表)

1. 描述性统计信息

s.mean() # 均值 s.median() # 中位数 s.mode() # 众数 s.max() # 最大值 s.min() # 最小值 s.var(ddof) # 方差(ddof代表自由度校正值) s.std(ddof) # 标准差(ddof代表自由度校正值) s.skew() # 偏态系数 s.kurt() # 峰度系数

2. 相关性分析

df.cov() # 协方差 df.corr(method) # 相关系数(默认'pearson'表示皮尔逊相关系数,可选值还有'kendall'和'spearman')

Day66-80/76.深入浅出pandas-5.md 中用波士顿房价数据集演示了corr的实际用途:boston_df[['NOX', 'RM', 'PTRATIO', 'LSTAT', 'PRICE']].corr()计算皮尔逊相关系数找出与房价正/负相关的特征,再用corr(method='spearman')对比秩相关的结果。

3. 排序和头部值

# 排序(Series) s.sort_values( asending, # 升序或降序(默认值True) inplace, # 是否就地排序(默认值False) kind, # 排序算法(默认值'quicksort') na_position, # 空值的位置(默认值'last') key, # 指定比较元素的规则(函数) ) # 排序(DataFrame) df.sort_values( by, # 排序的依据 ascending, # 升序或降序(默认值True) inplace, # 是否就地排序(默认值False) kind, # 排序算法(默认值'quicksort') na_position, # 空值的位置(默认值'last') key, # 指定比较元素的规则(函数) ) # TopN元素(头部,Series) s.nlargest( n, # 前N个最大值 keep, # 如何处理重复值(默认值'first') ) # TopN元素(头部,DataFrame) df.nlargest( n, # 前N个最大值 columns, # 指定用于排序的列名 keep, # 如何处理重复值(默认值'first') ) # TopN元素(尾部,Series) s.nsmallest( n, # 前N个最小值 keep, # 如何处理重复值(默认值'first') ) # TopN元素(尾部,DataFrame) df.nsmallest( n, # 前N个最小值 columns, # 指定用于排序的列名 keep, # 如何处理重复值(默认值'first') )

4. 分组聚合

df.groupby( by, # 指定用于分组的列名 level, # 对于多级索引指定用哪一级分组 as_index, # 是否将分组的列设置为索引(默认值True) sort, # 是否对分组的结果进行排序(默认值True) observed, # 只考虑在数据中实际出现的分组(默认值False) ).aggregate( func, # 单个函数或函数列表 args, # 函数的可变参数 kwargs, # 函数的关键字参数 )

Day66-80/75.深入浅出pandas-4.md 用 2020 年销售数据把这个流程讲透了,四个递进例子非常有代表性:

# 按销售区域分组,求销售额之和(结果为Series) df.groupby('销售区域').销售额.sum() # 按月份分组(先用 dt.month 提取月份再分组) df.groupby(df['销售日期'].dt.month).销售额.sum() # 多级分组:每个销售区域每个月的销售总额 df.groupby(['销售区域', df['销售日期'].dt.month]).销售额.sum() # 多聚合函数:agg 同时求总和、最大值、最小值,并可重命名结果列 df.groupby('销售区域').销售额.agg(销售总额='sum', 单笔最高='max', 单笔最低='min') # 对不同列使用不同聚合函数 df.groupby('销售区域')[['销售额', '销售数量']].agg({...})

此外还有宽窄表互转的两个方法:df.pivot(index=..., columns=..., values=...)把「窄表」转成行少列多的宽表;df.melt(id_vars=..., value_vars=..., var_name=..., value_name=...)把宽表「熔化」成长表。

df.pivot( index, # 指定用作索引的列 columns, # 要作为新列的列 values, # 用于填充新DataFrame中的值的列 ) df.melt( id_vars, # 在转换过程中保持不变的列 value_vars, # 要转换为行的列 var_name, # 指定存储原列名的新列名 value_name, # 指定存储原数据值的新列名 )

5. 透视表

透视表的本质就是对数据进行分组聚合操作,即根据 A 列对 B 列进行统计——用过 Excel 透视表的读者对此一定不陌生。index参数相当于「A 列」、values参数相当于「B 列」,二者都可以是单列或多列。

pd.pivot_table( data, # DataFrame对象 values, # 需要聚合的列 index, # 分组数据的字段(行索引) columns, # 分组数据的字段(列索引) aggfunc, # 聚合函数(默认值'mean') fill_value, # 填充空值的值 margins, # 是否计算行列总计(默认值False) margins_name, # 总计列的名字(默认值'All') observed # 只考虑在数据中实际出现的分组(默认值False) )

Day66-80/75.深入浅出pandas-4.md 给出了从简到繁的三个例子:

# 统计每个销售区域的销售总额 pd.pivot_table(df, index='销售区域', values='销售额', aggfunc='sum') # 统计每个销售区域每个月的销售总额(两个行索引) pd.pivot_table(df, index=['销售区域', '月份'], values='销售额', aggfunc='sum') # 销售区域作行、月份作列,空值补0,并增加行列总计 pd.pivot_table(df, index='销售区域', columns='月份', values='销售额', aggfunc='sum', fill_value=0, margins=True, margins_name='总计')

注意:同样按单个列聚合时,groupby返回Series,而pivot_table返回DataFrame,两者对象类型不同,后续操作方式也不同。

6. 交叉表

交叉表是一种特殊的透视表,它不需要先构造DataFrame对象,而是直接通过数组或Series指定多个因素进行运算得到统计结果。

pd.crosstab( index, # 交叉表中的行变量 columns, # 交叉表中的列变量 values, # 用于填充交叉表的值(可选项) aggfunc, # 聚合函数(可选项) margins, # 是否计算行列总计(默认值False) margins_name, # 总计列的名字(默认值'All') )

例如,准备销售区域与销售月份两组Series后,可用pd.crosstab(index=sales_area, columns=sales_month, values=sales_amount, aggfunc='sum').fillna(0).astype('i8')直接得到统计结果,再通过fillna和astype完成空值补零与类型转换。

阶段五:数据呈现(可视化)

数据分析的最后一步是呈现结论。pandas 内置的plot方法基于 matplotlib,一行代码即可完成常用图表绘制。

df.plot( figsize, # 图表尺寸(二元组) kind, # 图表类型 ax, # 绘图的坐标系 x, # 横轴数据 y, # 纵轴数据 title, # 图表标题 grid, # 是否绘制网格 legend, # 是否显示图例 xticks, # 横轴刻度 yticks, # 纵轴刻度 xlim, # 横轴取值范围 ylim, # 纵轴取值范围 xlabel, # 横轴标签 ylabel, # 纵轴标签 rot, # 轴标签旋转角度 fontsize, # 轴标签字体大小 colormap, # 颜色系列 stacked, # 是否绘制堆叠图(默认值False) colorbar, # 是否显示色彩条 )

plot方法最重要的参数是kind,它可以控制图表的类型:

  1. 折线图:kind='line'
  2. 散点图:kind='scatter'
  3. 柱状图:kind='bar'
  4. 条状图(水平柱状图):kind='barh'
  5. 饼状图:kind='pie'
  6. 直方图:kind='hist'
  7. 箱线图:kind='box'
  8. 面积图:kind='area'
  9. 核密度估计图:kind='kde'

仓库中的例子:Day66-80/75.深入浅出pandas-4.md 先在透视表上调用plot生成柱状图比较「每个销售区域的销售总额」;Day66-80/76.深入浅出pandas-5.md 中result_df.plot(kind='line', figsize=(10, 6))则用折线图展示时间序列趋势。更丰富的 matplotlib 应用见 Day66-80/78.数据可视化-1.md 起的可视化系列文档。

学习路线建议与仓库实践入口

「按流程学函数」这套方法的核心价值在于:每个阶段只记一组函数,使用时按流程定位。建议找一个真实数据集(例如本仓库 Day66-80/code/res/jobs 下的多城市职位数据 CSV,或 Day66-80/code/res/2023年北京积分落户数据.csv),按照「加载 → 查看 → 清洗 → 聚合 → 可视化」的顺序把本文涉及的函数完整走一遍,印象会深刻很多。

如果你希望系统性地深入学习 pandas,本仓库提供了完整的配套教程:

  • Day72 - 深入浅出pandas-1:Series与DataFrame的创建、运算、索引与切片
  • Day73 - 深入浅出pandas-2:read_csv/read_excel/read_sql数据加载细节
  • Day74 - 深入浅出pandas-3:concat/merge数据重塑,缺失值与重复值清洗
  • Day75 - 深入浅出pandas-4:groupby分组聚合与pivot_table/crosstab透视表实战
  • Day76 - 深入浅出pandas-5:协方差、相关系数与时间序列分析
  • Day77 - 深入浅出pandas-6:更多进阶数据处理技巧
  • 配套可运行代码:Day66-80/code/day04.ipynb 至 Day66-80/code/day06.ipynb 中包含了上述教程的全部可执行示例

此外,数据分析的前置铺垫(NumPy)与后续延伸(可视化)分别在 Day66-80/68.NumPy的应用-1.md 起的 NumPy 系列和 Day66-80/78.数据可视化-1.md 起的可视化系列中。需要说明的是,随着数据体量增大,业界也出现了 polars、cuDF 等 pandas 替代品,但它们的核心 API 与使用方式跟 pandas 大同小异——吃透 pandas 这套流程方法论,迁移到任何新工具上都能快速上手。

总结:驾驭 pandas 的关键不在于背下所有函数,而在于建立「三大核心类型 + 五阶段分析流程」的知识地图。把本文的速查表保存下来,在实际项目中按流程调用,你就能从「思路混乱」走向「得心应手」。

  • 文档
  • 教程

【免费下载链接】Python-100-Days

Python - 100天从新手到大师

项目地址:https://gitcode.com/GitHub_Trending/py/Python-100-Days
点击查看免费下载
上一篇:全面战争模组工具 RPFM:把"发布即崩溃"变成"保存前查出问题"
下一篇:ETS2LA 欧卡2自动驾驶辅助完整上手指南:3步装好、30分钟上手、长途从此解放双脚

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表