12  极简NumPy和Pandas入门

更加详细的数据清洗、处理和绘图,会在后续专门的章节进行讲解。

12.1 NumPy: 书店销售数据

以书店销售数据为背景,我们将依次介绍numpy的数组创建、操作、四则运算、聚合函数和布尔筛选。这样的结构将有助于清晰地展示每个概念在实际情况中的应用。

12.1.1 数据准备

首先,我们从书店的基本数据开始,即书籍的价格和销售数量。

数组创建

从列表创建一维数组来记录书籍的价格和销售数量:

import numpy as np

# 书籍的单价列表
price_list = [120, 85, 100, 75, 95]
# 将列表转换为numpy数组
prices = np.array(price_list)

# 书籍的销售数量列表
quantity_list = [30, 15, 20, 10, 25]
# 将列表转换为numpy数组
quantities = np.array(quantity_list)

# 书籍名称
book_names = np.array(['微观经济学', '宏观经济学', '金融学', '会计学','Python数据分析'])


print("书籍价格数组:", prices)
print("销售数量数组:", quantities)
书籍价格数组: [120  85 100  75  95]
销售数量数组: [30 15 20 10 25]

索引和切片

展示如何获取数组中的特定元素和子数组:

# 获取第一本书的价格和销售数量
first_book_price = prices[0]
first_book_quantity = quantities[0]

print("第一本书的价格:", first_book_price)
print("第一本书的销售数量:", first_book_quantity)

# 获取前三本书的价格和销售数量
first_three_prices = prices[:3]
first_three_quantities = quantities[:3]

print("前三本书的价格:", first_three_prices)
print("前三本书的销售数量:", first_three_quantities)
第一本书的价格: 120
第一本书的销售数量: 30
前三本书的价格: [120  85 100]
前三本书的销售数量: [30 15 20]

布尔数组和筛选

创建布尔数组并筛选出价格高于90元的书籍:

# 创建一个布尔数组,用于筛选价格高于90元的书籍
high_price_filter = prices > 90
high_price_books = prices[high_price_filter]

print("价格高于90元的书籍:", high_price_books)
价格高于90元的书籍: [120 100  95]

12.1.2 数组运算

使用数组运算来计算总销售额和应用折扣。

基本数学运算

计算总销售额(未折扣前):

# 计算每本书未折扣前的总销售额
total_sales = prices * quantities
print("未折扣前的总销售额:", total_sales)
未折扣前的总销售额: [3600 1275 2000  750 2375]

应用折扣

计算折后总价:

# 书籍的折扣比率
discount_rates = np.array([0.1, 0.05, 0.15, 0.05, 0.1])  # 10%, 5%, 15%, 5%, 10%

final_prices = total_sales * (1 - discount_rates)
print("折扣后的销售额:", final_prices)
折扣后的销售额: [3240.   1211.25 1700.    712.5  2137.5 ]

12.1.3 常见函数

使用聚合和其他常见函数:

print("所有书籍的最终总销售额:", final_prices.sum())
print("最低销售额的书籍:", final_prices.min())
print("最高销售额的书籍:", final_prices.max())
print("平均销售额:", final_prices.mean())
所有书籍的最终总销售额: 9001.25
最低销售额的书籍: 712.5
最高销售额的书籍: 3240.0
平均销售额: 1800.25

12.1.4 练习题

12.1.4.1 题目 1: 价格调整

假设书店决定对所有书籍价格进行统一调整,增加5元。请使用numpy数组操作来更新prices数组,并打印新的价格数组。

提示: 使用向量化操作来增加数组中的每一个元素。

12.1.4.2 题目 2: 销售筛选

书店想要了解哪些书籍的销售额在折扣后仍然超过2000元。使用布尔索引来筛选出这些书籍的价格和名称,并打印结果。

提示: 先计算折后总销售额,然后创建一个布尔数组用于筛选。

12.1.4.3 题目 3: 总结统计

请计算并打印以下统计信息:

  • 所有书籍的销售总数。
  • 折扣后每本书平均的销售额。
  • 折扣率最高的书籍的名称和价格。

提示: 使用sum(), mean()函数,以及argmax()来找到折扣率最高的书籍。

12.2 Pandas: 书店数据管理

在这个例子中,我们将使用一个关于书店的数据集,包含书籍的名称、价格、销售数量和评分。通过这个例子,我们将演示如何使用pandas进行数据的创建、操作、排序和文件的读写。

12.2.1 导入pandas库

首先,导入pandas库并为其常用的别名pd

import pandas as pd

12.2.2 创建DataFrame

使用字典来创建一个DataFrame,其中包括书籍的名称、价格、销售数量和评分:

data = {
    "Book": ['微观经济学', '宏观经济学', '金融学', '会计学','Python数据分析'],
    "Price": [120, 85, 100, 75, 95],
    "Quantity": [30, 15, 20, 10, 25],
    "Rating": [4.5, 4.0, 4.8, 3.9, 4.1],
}
df = pd.DataFrame(data)
df
Book Price Quantity Rating
0 微观经济学 120 30 4.5
1 宏观经济学 85 15 4.0
2 金融学 100 20 4.8
3 会计学 75 10 3.9
4 Python数据分析 95 25 4.1

12.2.3 数据选择与操作

12.2.3.1 使用.loc

.loc主要用于基于标签的索引,即选择行或列的名称来访问数据。

选择特定的行

# 选择第一本书的数据
first_book = df.loc[0]
print("第一本书的数据:\n")
first_book
第一本书的数据:
Book        微观经济学
Price         120
Quantity       30
Rating        4.5
Name: 0, dtype: object

选择特定的列

# 选择书籍名称和价格列
books_prices = df.loc[:, ["Book", "Price"]]
print("书籍和价格:\n")
books_prices
书籍和价格:
Book Price
0 微观经济学 120
1 宏观经济学 85
2 金融学 100
3 会计学 75
4 Python数据分析 95

也有快速的写法

# 选择书籍名称和价格列
books_prices = df[["Book", "Price"]]
print("书籍和价格:\n")
books_prices
书籍和价格:
Book Price
0 微观经济学 120
1 宏观经济学 85
2 金融学 100
3 会计学 75
4 Python数据分析 95

12.2.3.2 使用.iloc

.iloc用于基于位置的索引,即选择行或列的数值索引来访问数据。

选择特定的行

# 选择前三本书的数据
first_three_books = df.iloc[:3]
print("前三本书的数据:\n")
first_three_books
前三本书的数据:
Book Price Quantity Rating
0 微观经济学 120 30 4.5
1 宏观经济学 85 15 4.0
2 金融学 100 20 4.8

选择特定的列

# 选择价格和数量列(索引1和2)
price_quantity = df.iloc[:, [1, 2]]
print("价格和数量:\n")
price_quantity
价格和数量:
Price Quantity
0 120 30
1 85 15
2 100 20
3 75 10
4 95 25

12.2.4 条件筛选

使用条件表达式来筛选满足特定条件的行。

根据条件选择行

# 选择评分高于4.0的书籍
high_rated_books = df[df["Rating"] > 4.0]
print("评分高于4.0的书籍:\n") 
high_rated_books
评分高于4.0的书籍:
Book Price Quantity Rating
0 微观经济学 120 30 4.5
2 金融学 100 20 4.8
4 Python数据分析 95 25 4.1

使用query方法 这是一个更动态的方式来选择数据,允许使用字符串表达式来指定条件。

# 使用query方法选择价格小于100的书籍
affordable_books = df.query("Price < 100")
print("价格小于100的书籍:\n")
affordable_books
价格小于100的书籍:
Book Price Quantity Rating
1 宏观经济学 85 15 4.0
3 会计学 75 10 3.9
4 Python数据分析 95 25 4.1

12.2.5 修改数据列

添加一列“Total Sales”,计算每本书的总销售额:

df["Total Sales"] = df["Price"] * df["Quantity"]
print(df)
         Book  Price  Quantity  Rating  Total Sales
0       微观经济学    120        30     4.5         3600
1       宏观经济学     85        15     4.0         1275
2         金融学    100        20     4.8         2000
3         会计学     75        10     3.9          750
4  Python数据分析     95        25     4.1         2375

12.2.6 数据排序

根据总销售额对书籍进行降序排序:

df_sorted = df.sort_values(by="Total Sales", ascending=False)
print("按总销售额排序:\n")
df_sorted
按总销售额排序:
Book Price Quantity Rating Total Sales
0 微观经济学 120 30 4.5 3600
4 Python数据分析 95 25 4.1 2375
2 金融学 100 20 4.8 2000
1 宏观经济学 85 15 4.0 1275
3 会计学 75 10 3.9 750

12.2.7 读取和写入数据

写入CSV文件

将DataFrame写入CSV文件,文件名为bookstore.csv

df.to_csv("bookstore.csv", index=False)
print("数据已写入 'bookstore.csv'")
数据已写入 'bookstore.csv'

读取CSV文件 读取之前写入的CSV文件,查看内容:

df_loaded = pd.read_csv("bookstore.csv")
print("从CSV文件加载的数据:\n")
df_loaded
从CSV文件加载的数据:
Book Price Quantity Rating Total Sales
0 微观经济学 120 30 4.5 3600
1 宏观经济学 85 15 4.0 1275
2 金融学 100 20 4.8 2000
3 会计学 75 10 3.9 750
4 Python数据分析 95 25 4.1 2375

12.2.8 练习题

12.2.8.1 题目 1: 计算平均评分

假设你想了解书店中所有书籍的平均评分。使用pandas的函数计算并打印这个数据集中所有书籍的平均评分。

提示: 使用mean()函数来计算列的平均值。

12.2.8.2 题目 2: 筛选特定的书籍

书店老板对销售表现不佳的书籍(总销售额低于2000元)进行特价处理。请筛选出这些书籍的名称和当前价格,并打印结果。

提示: 使用条件筛选来实现这一点,你可能需要先计算每本书的总销售额。

12.2.8.3 题目 3: 新书上架

书店有新书上架,需要更新DataFrame。请将下面的新书信息添加到现有的DataFrame中,并重新打印更新后的DataFrame。

新书信息:

  • Book: ‘计量经济学’
  • Price: 90
  • Quantity: 20
  • Rating: 4.3

提示: 使用append()函数或concat()函数来添加新行。