欢迎来到 Python 基础入门 Day21!在前两天的课程中,我们学习了 Pandas 的基础操作和分组聚合技巧。今天,我们将进一步探讨 Pandas 的高级功能,包括 数据透视表、多索引操作 和 数据合并与连接。这些技能在实际数据分析中非常重要,能够帮助你处理更复杂的结构化数据。
目录
- 数据透视表(Pivot Table)
- 多索引与层级索引操作
- 数据合并与连接
- 小结与练习
一、数据透视表(Pivot Table)
数据透视表是一种强大的工具,可以快速对数据进行分组、聚合和总结。它类似于 Excel 中的透视表。
1.1 创建透视表
使用 Pandas 的 pivot_table()
方法可以创建数据透视表。
import pandas as pd
# 示例数据
data = {
"Region": ["North", "North", "South", "South", "East", "East"],
"Product": ["A", "B", "A", "B", "A", "B"],
"Sales": [200, 150, 300, 400, 250, 100],
"Profit": [20, 15, 30, 40, 25, 10],
}
df = pd.DataFrame(data)
# 创建透视表:按地区和产品计算销售额的总和
pivot = pd.pivot_table(df, values="Sales", index="Region", columns="Product", aggfunc="sum", fill_value=0)
print(pivot)
输出:
Product A B
Region
East 250 100
North 200 150
South 300 400
1.2 添加多个聚合函数
你可以同时对多个列应用不同的聚合函数。
# 透视表:同时计算销售额和利润的总和与平均值
pivot = pd.pivot_table(
df,
values=["Sales", "Profit"],
index="Region",
aggfunc={"Sales": ["sum", "mean"], "Profit": ["sum", "mean"]}
)
print(pivot)
二、多索引与层级索引操作
2.1 创建多索引
多索引(MultiIndex)是 Pandas 的一大特色,可以帮助我们对数据进行多维度的索引和操作。
# 创建多索引 DataFrame
df_multi = df.set_index(["Region", "Product"])
print(df_multi)
输出:
Sales Profit
Region Product
North A 200 20
B 150 15
South A 300 30
B 400 40
East A 250 25
B 100 10
2.2 索引操作
- 重置索引:将多索引还原为普通列。
# 重置索引
df_reset = df_multi.reset_index()
print(df_reset)
- 交换索引顺序:调整多索引的顺序。
# 交换索引顺序
df_swapped = df_multi.swaplevel()
print(df_swapped)
- 排序索引:根据索引顺序排序。
# 按索引排序
df_sorted = df_multi.sort_index(level=0)
print(df_sorted)
三、数据合并与连接
Pandas 提供了多种方式将不同的数据集合并到一起,比如 merge
、concat
和 join
。
3.1 使用 merge
合并数据
merge()
类似于 SQL 的 JOIN 操作,可以根据一个或多个键将两个表合并。
# 示例数据
df1 = pd.DataFrame({"ID": [1, 2, 3], "Name": ["Alice", "Bob", "Charlie"]})
df2 = pd.DataFrame({"ID": [1, 2, 4], "Salary": [5000, 6000, 7000]})
# 合并数据
merged = pd.merge(df1, df2, on="ID", how="inner")
print(merged)
输出:
ID Name Salary
0 1 Alice 5000
1 2 Bob 6000
支持多种连接方式:
how="inner"
:默认值,只保留两表中共有的行。how="left"
:保留左表的所有行。how="right"
:保留右表的所有行。how="outer"
:保留所有行,缺失值填充为 NaN。
3.2 使用 concat
拼接数据
concat()
按行或列拼接数据。
# 示例数据
df3 = pd.DataFrame({"Name": ["David", "Eve"], "Age": [30, 25]})
# 按行拼接
concatenated = pd.concat([df1, df3], ignore_index=True)
print(concatenated)
输出:
ID Name Age
0 1.0 Alice NaN
1 2.0 Bob NaN
2 3.0 Charlie NaN
3 NaN David 30.0
4 NaN Eve 25.0
3.3 使用 join
合并索引匹配的数据
join()
方法适用于索引对齐的合并操作。
# 示例数据
df4 = df1.set_index("ID")
df5 = df2.set_index("ID")
# 按索引合并
joined = df4.join(df5, how="inner")
print(joined)
四、小结与练习
今天,我们学习了 Pandas 的高级操作,包括:
- 数据透视表:快速对数据进行分组和聚合。
- 多索引:对复杂的层级数据进行灵活操作。
- 数据合并与连接:灵活地整合多个数据集。
今日练习题:
- 创建一个包含以下列的 DataFrame:
City
(城市名称)。Month
(月份)。Temperature
(温度)。Rainfall
(降水量)。
- 使用数据透视表,按城市和月份计算平均温度和降水量。
- 将一个包含 PM2.5 数据的 DataFrame 与上述 DataFrame 合并,并生成一个新的 DataFrame。
- 将合并后的数据转换为多索引格式,并按城市进行排序。
下一节预告:在 Day22 中,我们将学习 Pandas 的 时间序列操作,包括如何处理时间数据和进行时间序列分析。敬请期待!
希望你今天的学习愉快!如果有任何问题,随时讨论 😊。