Python:图解 Pandas

张开发
2026/4/16 7:24:12 15 分钟阅读

分享文章

Python:图解 Pandas
NumPy 与 Pandas 有一个共同点它们都用于存储数据并对数据进行操作。NumPy当需要进行数值计算尤其是数组或矩阵运算时应使用 NumPy。它非常适合数学运算、线性代数以及科学计算。Pandas当处理结构化或表格型数据时应使用 Pandas。如果需要对表格数据或 CSV 文件进行清洗、整理与分析Pandas 往往是首选库若需要进一步可视化则常与 Matplotlib、Seaborn 等工具配合使用。如果将 NumPy 理解为一个高性能的多维数组系统ndarray那么可以将 Pandas 理解为带标签的表格结构DataFrame。Pandas 提供的两种核心数据结构• Series一维结构• DataFrame二维结构在 DataFrame 中每一列本质上是一个 Series。可以将 DataFrame 理解为一张数据库表我们可以像使用 SQL 一样对其进行查询和数据操作。要注意的是DataFrame 是内存中的数据结构而数据库表属于持久化存储结构。一、导入 Pandasimport pandas as pd二、构建并认识 DataFrame1、构建 DataFrame1手动创建最常见的方式是从字典创建import pandas as pd df pd.DataFrame({ 姓名: [张三, 李四, 王五], 城市: [北京, 上海, 北京], 年龄: [25, 30, 28]})2从文件创建常通过读取 .csv 数据并构建 DataFrameimport pandas as pd blog pd.read_csv(blog.csv)opensource pd.read_csv(opensource.csv)solothought pd.concat( [blog, opensource], keys[blog, OpenSource], names[Type, idx])# st solothought2、DataFrame 结构下图展示了 DataFrame 的各个组成部分。DataFrame 是带标签的二维数据结构行标签由 df.indexIndex管理列标签由 df.columnsIndex管理。1列标签系统DataFrame 的每一列由列标签进行标识这些列标签统一存储在df.columns # 查看列标签df.columns 是一个 Index 对象负责管理所有列标签。每一列本质上是一个 Series 对象。2行索引系统DataFrame 的每一行由行索引Index 进行标识。这些索引统一存储在df.index # 查看行索引df.index.names # 查看索引层名称行索引用于定位数据例如solothought.loc[(blog, 2)]3多级行索引图中左侧展示的是多级行索引结构MultiIndexType idx----------------blog 0blog 1...OpenSource 0OpenSource 1pd.concat() 在合并数据时通过 keys 参数自动生成第一层行索引Type和第二层行索引idx从而形成 MultiIndex多级索引结构。这些层级名称存储在df.index.names通过多级索引可以实现更高维度的数据组织方式。例如solothought.loc[blog]solothought.loc[OpenSource]4SeriesDataFrame 中每一列都是一个 Series 对象solothought[title]solothought[views]Series 由索引Index与一维数据底层数组/ExtensionArray组成。3、查看数据样本常用方法包括df.head() # 查看前5条记录df.tail() # 查看后5条记录 solothought.sample(5, weightsviews) # 随机抽取5条记录按权重其中权重weights可以是• 列名• 数组• Series三、DataFrame 常见数据操作1、查看数据结构df.shape # 查看数据维度 (rows, columns)len(df) # 查看行数df.info()输出内容包括• DataFrame 类型• 行数与索引范围• 每列的非空值数量• 数据类型dtype• 内存使用情况2、选择数据1选择行可以通过切片方式选择行df[0:5] # 前 5 行df[-5:] # 最后 5 行对于 DataFramedf[0:5] 这类切片通常表现为按行切片常用于取前几行或后几行若需要明确按整数位置选择推荐使用 iloc()。2选择列选择单列solothought.title# 或者solothought[title]选择多列solothought[[title, category]]3、新增行/列在 Pandas 中可以通过构造新的 DataFrame 或 Series然后使用相关函数将其追加到现有数据表中。1添加行可以通过拼接 DataFrame 添加行。示例使用 concat()row pd.DataFrame({ title: strnum, category: library, tags: numeric, uses: 72000, featured: False}, index[(OpenSource, 4)]) solothought pd.concat([solothought, row])该操作会在 DataFrame 末尾新增一条记录并自动对齐列结构。2添加列方法一直接赋值添加列l [1 Apr 2023, 2 Apr 2023] [None] * 14 # 列表元素个数要与 DataFrame 的行数一致solothought[published on] l方法二使用 insert() 可以指定要插入的列位置。solothought.insert(4, published on, l)方法三assign() 适用于链式操作solothought solothought.assign(**{published on: l})4、数据清洗Pandas 中许多方法默认返回新的 DataFrame而不会修改原对象。如需原地修改请设置 inplaceTrue或将返回值重新赋值给变量。1删除行/列drop() 用于删除 DataFrame 中的行或列返回删除后的新 DataFrame默认不会修改原对象。删除行solothought.drop(0) # 按行索引删除solothought.drop(1, inplaceTrue) # 原地删除solothought.drop([0, 2, 4]) # 删除多行solothought.drop(index[0, 2, 4])solothought.drop((blog, 1), axis0, inplaceTrue) # 多级索引删除 (blog, 1) 这一行 #条件删除# 先筛选索引再删除hv solothought[solothought[views] 1000]solothought.drop(hv.index) #删除 views 大于 1000 的行删除列solothought.drop(views, axis1) # 按列名删除solothought.drop([views, tags], axis1) # 删除多列solothought.drop(columns[views, tags])solothought.drop(columns[views], inplaceTrue) # 原地删除2转换列数据例如某列中布尔值以 y 和 n 表示使用 apply() 或 map() 进行列操作将其转换为真正的布尔值solothought[featured] solothought[featured].apply( lambda x: True if x y else False)5、缺失值处理在数据分析之前通常需要先处理或填充缺失值。Pandas 常用 NaN 或 pd.NA 表示缺失值不同 dtype 的缺失值标记可能不同。在读取 CSV 时可以指定哪些值应被视为 NA。1检查缺失值solothought.isnull() # 检查整个 DataFrame 的缺失值solothought[views].isnull() # 检查某列的缺失值2统计缺失值数量solothought.isnull().sum()3删除包含缺失值的行或列solothought.dropna() # 默认 axis0, howany只要该行存在 NA 即删除dropna() 的主要参数• axis指定删除行或列• how指定“全部为 NA 才删除”或“存在 NA 即删除”• thresh指定保留所需的最少非 NA 数量• subset指定检查 NA 的列3填充缺失值solothought[views].fillna(0)6、数据聚合Pandas 提供大量统计函数用于数据汇总。1描述统计solothought[views].describe()2常用统计函数count 9.000000 solothought[views].count()mean 535.333333 solothought[views].mean()std 494.384719 solothought[views].std()min 14.000000 solothought[views].min()25% 85.00000050% 350.000000 solothought[views].quantile()75% 780.000000max 1331.000000 solothought[views].max()Name: views, dtype: float643统计分类数量value_counts() 可用于计算各类别出现的次数solothought[category].value_counts()四、数据选择loc 与 iloc可以通过索引、loc() 或 iloc() 选择行、列或具体值。1、基于标签选择loc() 是 Pandas 中最常用的基于标签的数据选择工具。df.loc[rows, cols]• rows行标签Index label• cols列标签Column label1按行索引标签选择solothought.loc[blog]solothought.loc[[blog,OpenSource]] # 按多个行索引标签选择选择第一层行索引标签为 blog 的所有记录。可以逐层访问 MultiIndexsolothought.loc[blog].loc[0]先选择 blog 这一层再选择第二层行索引 0。2行与列同时选择可以同时指定行与列solothought.loc[blog, [title, category]]表示选择行索引标签为 blog 的所有行返回 title 与 category 的、两列。solothought.loc[blog].loc[:5,[title, category]]返回前 6 行solothought.loc[blog, [title, category]][0:6]还可以只指定列solothought.loc[:, [title, category]]3标签切片loc() 支持标签切片需要注意 loc() 的切片通常包含终止标签inclusive。选择指定行索引范围的指定列solothought.loc[blog].loc[:5,[title, category]]以选择从某列开始直到最后一列solothought.loc[blog, category:]4排序后的索引访问当多级索引经过排序后可以进行更复杂的选择st solothought.sort_index(level0)用 MultiIndex 进行范围切片st.loc[(blog, 1):(blog, 2), [title, category]] # 先取第一层再在子表上切st.loc[blog].loc[1:2, [title, category]]多级索引结构中可按指定层级选择st.loc[(blog,1)]选择指定行标签的全部列solothought.loc[[blog, OpenSource],:]2、基于位置选择iloc() 使用整数位置0,1,2… 来选择行和列而不是使用标签。df.iloc[rows, cols]• rows行位置• cols列位置1单行访问返回第 0 行数据Seriessolothought.iloc[0]2切片访问选择第 0~5 行选择第 0~1 列solothought.iloc[0:6, 0:2] # 方法一solothought.iloc[:,0:2][0:6] # 方法二solothought.iloc[0:6, [0,1]] # 方法三注意行切片包含起点不包含终点。3、快速访问单个元素iat() 是 iloc() 的单值版本用于访问一个具体元素。df.iat[row, col]row 和 col 均是整数位置索引。示例solothought.iat[0, 1]4、添加新行当列结构已明确且赋值数据能够与列对齐时可以通过 loc[] 为一个新索引标签赋值从而添加新行。示例solothought.loc[(blog, i)] some_list表示在指定位置插入一行行数据来自字典或列表。五、条件筛选1、基于布尔值的行筛选在 Pandas 中可以使用布尔序列Boolean array来决定哪些行应被保留。• True → 保留该行• False → 丢弃该行示例solothought.loc[blog, [title, category]].loc[ [False,False,False,False,True,False,False,True,False,True], [True,True]]执行过程可以分为两个阶段第一步选择数据子集solothought.loc[blog, [title, category]]得到 blog 行标签分类下的 2 列。第二步使用布尔数组筛选.loc[ [False,False,False,False,True,False,False,True,False,True], [True,True]]其中第一组布尔值决定保留哪些行第二组布尔值决定保留哪些列。使用布尔索引时需要满足两个条件• 布尔序列长度必须与数据行数一致• True / False 的位置决定数据保留情况2、条件筛选在实际数据分析中布尔数组通常由条件表达式自动生成。1使用比较运算生成布尔序列solothought[views] 500Pandas 会自动生成一个与 DataFrame 行数相同的布尔序列。并完成筛选。2利用布尔序列筛选 DataFrame 行solothought[solothought[views] 500]筛选结果仅保留 views 大于 500 的记录。3使用逻辑运算符组合多个条件Pandas 使用按位逻辑运算符、|、~来组合多个条件。solothought[ (solothought[views] 500) (solothought[featured] False)]4可与 loc() 结合进行更精确的数据选择比如solothought.loc[solothought[category] tutorial]或者solothought.loc[solothought[views] 500]随后可以继续进行数据分析例如统计分类数量solothought.loc[solothought[views] 500].value_counts(category)六、数据处理的常见操作Pandas 在数据分析过程中常用的四类操作条件查询query、随机抽样sample、重复数据检测与删除duplicate、数据替换replace。这些方法常用于数据清洗与数据预处理阶段。1、条件查询query() 方法允许使用类似 SQL 的表达式对 DataFrame 进行条件筛选。相比直接书写布尔索引query() 往往提供了更直观的表达方式。基本用法solothought.query(views 500)表示筛选出 views 大于 500 的记录。也可以组合多个条件solothought.query(views 500 and not featured)# 或者solothought.query(views 500 (featured False))query() 的优势是可以直接使用列名作为变量无需写 df[column]。2、随机抽样sample() 用于从数据集中随机抽取样本常用于数据探索或机器学习实验。示例solothought.sample(3, weightsviews)表示从 DataFrame 中抽取 3 条记录抽样概率与 views 列的值成比例权重抽样。如果不指定 weights则默认进行均匀随机抽样。3、重复数据检测与删除在数据清洗中需要检测并移除重复记录。检测重复行solothought.duplicated()返回一个 布尔序列True 表示该行是重复数据False 表示唯一数据。删除重复行solothought.drop_duplicates()返回一个去除重复记录后的 DataFrame。4、数据替换replace() 用于批量替换数据值适用于数据清洗与分类标准化。示例solothought.replace({ category: {library: package}, views: {np.nan: 0}})表示将 category 列中的 library 替换为 package将 views 列中的缺失值 NaN 替换为 0。多值替换solothought.replace( [tutorial, info], [learn, news])表示将值 tutorial 替换为 learn将值 info 替换为 news。当参数 regexTrue 时replace() 还可以进行正则表达式替换用于文本数据处理。七、数据处理的三个核心能力分组统计GroupBy、缺失值填充Fill Missing Value以及数据修改Modify Data。这些操作通常出现在数据清洗与数据分析阶段是 Pandas 数据处理能力的重要组成部分。1、分组计算groupby() 用于按照某一列或多列对数据进行分组并在每个分组上执行统计或聚合计算。示例grp solothought.groupby(category)按照 category 列对数据进行分组每个类别形成一个分组。1查看分组信息grp.groups返回每个分组对应的行索引。2获取指定分组grp.get_group(library)返回 category library 的所有记录。3分组统计grp.size()统计每个分组的记录数量。grp[title].count()统计各分组中 title 列的非空值数量。4分组聚合常见聚合函数包括grp[views].min()grp[views].max()grp[views].std()grp[views].describe()这些函数会分别计算每个分组的统计指标。5分组过滤filter() 可以根据条件筛选满足要求的分组。示例grp.filter(lambda x: x[views].max() 1300)仅保留最大 views 超过 1300 的分组。另一示例grp.filter(lambda x: x[featured].sum() 1)仅保留 featured 文章数量超过 1 的分组。2、缺失值填充Pandas 提供多种方法用于处理缺失值NaN。1使用 fillna()solothought[views].fillna(0)将缺失值替换为 0。也可以使用统计值填充solothought[views].fillna(solothought[views].mean())常见填充方式包括• mean平均值• median中位数• mode众数2插值填充interpolate() 用于根据数据趋势对缺失值进行插值估计solothought.loc[blog][views].interpolate( methodpolynomial, order3)常见插值方法包括• linear• polynomial• spline• nearest• time该方法通常用于数值型数据的时间序列或连续数据填补。3、数据修改Pandas 提供多种方式对 DataFrame 数据进行批量修改。1使用 apply()apply() 可以对每一行或每一列应用函数df.apply(lambda x: Fixed value, axis1)其中axis1 表示按行处理axis0 表示按列处理。apply() 会根据函数返回结果生成新的 Series 或 DataFrame具体形式取决于操作对象和返回值结构。示例def prefix(row): if row.category info: row[tags] str(row[tags]) |news return row solothought solothought.apply(prefix, axis1)该操作为 info 分类的文章标签添加 news。2使用 map()map() 用于对 Series 中的每个元素应用函数series.map(lambda x: Fixed value).map() 将返回与原 Series 相同形状的数据常用于值映射或简单转换。如果在分组数据上执行类似操作则通常使用 .transform()。八、多级索引的创建与管理多级索引MultiIndex允许在行或列方向上建立多层标签使二维数据表能够表达更高维度的数据结构。1、创建列多级索引Pandas 可以通过元组列表tuple list 创建列的多级索引。例如cols [ (mandatory, title), (mandatory, category), (mandatory, tags), (extra, views), (extra, featured), (extra, uses)] solothought.columns pd.MultiIndex.from_tuples(cols)该操作将列结构分为两个层级• 第一层字段分组• 第二层具体字段这样可以将数据列按逻辑分组使数据结构更加清晰。2、查看索引层Pandas 提供属性用于查看索引层结构。1查看行索引层solothought.index.levels返回[Index([blog,OpenSource]),Index([0,1,2,3,...])]2查看列索引层solothought.columns.levels示例输出[extra, mandatory][category,featured,tags,title,uses,views]说明mandatory → title, category, tagsextra → views, featured, uses3、由列创建行索引如果某些字段原本是普通列可以使用 set_index() 将它们设为新的行索引。例如对于包含 Type 和 idx 两列的普通 DataFrame可写为some_df.set_index([Type, idx])此操作会生成新的多级行索引。4、重置索引如果希望将索引转换回普通列可以使用 reset_index()solothought.reset_index()此操作会将索引如 Type、idx变为普通列并创建新的整数索引。或者丢弃 idx 这一层solothought solothought.reset_index(levelidx, dropTrue)# 或solothought solothought.droplevel(idx)5、修改索引结构solothought solothought.set_index((mandatory, category)) # 使用 category 作为新的索引# 或者solothought.index.names [category] # 重命名索引层名称6、多级索引的意义MultiIndex 的核心作用是在二维 DataFrame 中表达更复杂的数据关系。它常用于• 分组统计结果• 数据透视表pivot table• 多维数据表示• 分层数据组织通过多级索引Pandas 能够在保持 DataFrame 结构的同时表示 更高维度的数据模型。 小结本文通过图解方式介绍了 Pandas 的核心结构与基本操作包括 DataFrame 与 Series 的关系、索引体系、数据选择与条件筛选、数据清洗、分组统计以及多级索引等内容。通过理解这些基础机制可以建立对 Pandas 数据结构与常见数据处理流程的整体认识为后续数据分析与实践应用打下基础。特别声明本文的基本框架、示例及所有图片来自以下网址感谢原作者的辛勤工作。https://solothought.com/tutorial/python-pandas-visual/“点赞有美意赞赏是鼓励”

更多文章