pandas 简介
学习 Python 的 pandas 库的基础知识。
pandas 是一个开源的 Python 库,提供高效的数据操作和分析工具。它提供了多种数据结构和处理方法,并支持多种数据格式。pandas 基于 Python 的 NumPy 库构建。
以下是一些关键特性,使得 pandas 成为广泛使用且受欢迎的库:
- 快速、高效且性能优越,支持大规模数据处理。
- 支持多种数据格式,如 CSV 文件、JSON、XML 和 SQL 数据库(仅举几例)。
- 提供数据清洗功能,支持缺失值处理。
Python 的 pandas 库支持以下两种主要数据结构:
- pandas Series
- pandas DataFrame
pandas Series 对象是一个一维带标签的数组。我们可以用任意 Python 数据类型填充 Series,例如整数、字符串、浮点数等。可以将 Series 理解为电子表格中的一列。所有 Series 对象默认都有索引,即每个元素都对应一个索引。
我们可以通过数组、字典、列表或标量创建 Series 对象。如下图所示,通过将 student_score 列表传入 pd.Series() 函数,可以创建名为 scores 的 Series 对象。每个元素都有索引,可以通过索引访问任意元素。这里使用了默认别名 pd 来引用 pandas 库。
pandas DataFrame 对象是一个二维数据结构,以行和列的形式组织数据。DataFrame 可以通过字典、列表、SQL 数据库、CSV 文件等方式填充。可以将 DataFrame 理解为电子表格中的一张表。DataFrame 默认也有索引,可以通过索引访问每一行。
下图展示了 DataFrame 对象的创建过程:通过将 data 字典传入 pd.DataFrame() 函数,创建了名为 df 的 DataFrame 对象。
Series 和 DataFrame 对象默认都是带索引的。但也可以在 pd.Series() 和 pd.DataFrame() 函数的 index 参数中指定自定义索引。
我们将使用存储在 CSV 格式中的 CustomerLaptopTransactionData.csv 数据集。要加载该数据集,使用 read_csv() 函数,如下代码片段所示。数据被加载到一个名为 transactions_df 的 pandas DataFrame 中:
1import pandas as pd 2transactions_df = pd.read_csv('CustomerLaptopTransactionData.csv') # load data
将数据集加载到 DataFrame 后,第一步是查看数据的结构。为了查看 DataFrame 中的记录,使用 pandas 的 head() 函数,它会显示前五条记录。
1print(transactions_df.head())
同样,可以使用 tail() 函数获取数据集的最后 条记录。默认情况下返回最后五条。
1print(transactions_df.tail())
我们可以在 head() 和 tail() 函数中传入任意在 DataFrame 记录范围内的数值。
但如何知道 DataFrame 中有多少条记录呢?pandas 也提供了相应方法。使用 DataFrame 的 shape 属性可以获取数据形状,返回一个元组(行数,列数),说明该数据集共有 86 行和 7 列。
1print(transactions_df.shape)
类似地,DataFrame 的 size 属性返回一个整数,表示元素总数(即行数乘以列数)。
1print(transactions_df.size)
了解数据集大小和列数后,下一步是了解各列的数据类型。为此,使用 pandas DataFrame 的 dtypes 属性。
1print(transactions_df.dtypes)
在上述代码中,Purchase_ID 和 laptop_price 是整数类型,其余列均为浮点数类型。
在掌握数据集的大小、列名和数据类型之后,接下来可以了解数据的分布情况。为此,使用 describe() 方法,它会返回数据集中数值型列的统计摘要。
1print(transactions_df.describe())
describe() 方法对 DataFrame 中的数值型数据计算一些统计指标,如百分位数、均值和标准差。
我们已经看到数据集中的 laptop_brand 列。假设我们好奇这家商店销售了多少种不同的笔记本品牌,也就是想知道 laptop_brand 列中唯一值的数量。这时可以使用 nunique() 方法,它返回某一列中唯一值的数量。该方法在探索分类变量时非常有用。
1print(transactions_df.nunique()) # 每列的唯一值数量
可以看到,共有两种不同品牌的笔记本电脑被售出。注意,这里的分类变量以数值形式表示,即某个数值代表一个品牌,另一个数值代表另一个品牌。这只是数据的一种常见表示方式。当然,这些值也可以以字符串形式存储(如 laptop_brand)。
我们已经整体查看和访问了 DataFrame。但也可以单独访问特定列进行分析。例如,可以使用 [] 符号访问 laptop_price 列,如下代码所示。这是因为 pandas 使用方括号来索引列。
1print("Single bracket\n", transactions_df['laptop_price']) 2print("\n") 3print("Double brackets\n", transactions_df[['laptop_price']])
在上述代码中,第 1 行使用 [],第 3 行使用 [[]]。你是否注意到两个输出之间的区别?
请暂停一下思考一下。有没有什么看起来熟悉的地方?
第一种方法 [] 默认返回一个 Series 对象,而第二种方法 [[]] 即使传入的是包含单个元素的列表,也会返回一个 DataFrame 对象。
第一种方法的输出是一个包含 86 行的 Series,而第二种方法返回的是一个包含 86 行 1 列的 DataFrame。
我们还可以查看每个类别的数量。之前已知 laptop_price 列有四个唯一值:600、1200。但我们想知道每种价格对应的销售数量。此时可以使用 value_counts() 方法。
1print(transactions_df['laptop_price'].value_counts())
可以看到,售价为 $900 的笔记本电脑销量最高。你是否发现,仅分析一列就能获得重要洞察?
pandas 库常与 seaborn 库配合用于数据可视化。我们使用 pandas 进行数据清洗和预处理,使数据适合 seaborn 可视化,从而让图表准确传达信息。