数据重塑
学会使用 Pandas 进行数据重塑。
学习内容
melt 方法
pivot 方法
代码示例
1. 导入 Pandas 库
import pandas as pd
2. 创建示例数据集
# 创建示例数据集(宽格式)
data = {
'姓名': ['张三', '李四', '王五'],
'数学成绩': [90, 85, 92],
'英语成绩': [88, 92, 89],
'物理成绩': [95, 88, 90]
}
df = pd.DataFrame(data)
print(f"原始数据集 (宽格式): \n{df}")
3. 使用 melt 方法
将宽格式数据转换为长格式数据
# 使用 melt 方法将宽格式数据转换为长格式数据
df_melted = df.melt(id_vars='姓名', value_vars=['数学成绩', '英语成绩', '物理成绩'],
var_name='科目', value_name='成绩')
print(f"使用 melt 方法转换后的数据集 (长格式): \n{df_melted}")
指定多个 id 变量
# 创建包含多个 id 变量的示例数据集
data = {
'姓名': ['张三', '李四', '王五'],
'班级': ['A班', 'B班', 'A班'],
'数学成绩': [90, 85, 92],
'英语成绩': [88, 92, 89],
'物理成绩': [95, 88, 90]
}
df = pd.DataFrame(data)
print(f"包含多个 id 变量的原始数据集: \n{df}")
# 使用 melt 方法将宽格式数据转换为长格式数据
df_melted = df.melt(id_vars=['姓名', '班级'], value_vars=['数学成绩', '英语成绩', '物理成绩'],
var_name='科目', value_name='成绩')
print(f"使用 melt 方法转换后的数据集 (长格式): \n{df_melted}")
4. 使用 pivot 方法
将长格式数据转换为宽格式数据
# 使用 pivot 方法将长格式数据转换为宽格式数据
df_pivoted = df_melted.pivot(index='姓名', columns='科目', values='成绩')
print(f"使用 pivot 方法转换后的数据集 (宽格式): \n{df_pivoted}")
保留多个值
# 创建包含多个值的示例数据集
data = {
'姓名': ['张三', '张三', '李四', '李四', '王五', '王五'],
'科目': ['数学成绩', '英语成绩', '数学成绩', '英语成绩', '数学成绩', '英语成绩'],
'成绩': [90, 88, 85, 92, 92, 89],
'学期': ['第一学期', '第一学期', '第一学期', '第一学期', '第一学期', '第一学期']
}
df_long = pd.DataFrame(data)
print(f"包含多个值的长格式数据集: \n{df_long}")
# 使用 pivot 方法将长格式数据转换为宽格式数据
df_pivoted = df_long.pivot(index='姓名', columns='科目', values='成绩')
print(f"使用 pivot 方法转换后的数据集 (宽格式): \n{df_pivoted}")
处理重复值
# 创建包含重复值的示例数据集
data = {
'姓名': ['张三', '张三', '李四', '李四', '王五', '王五'],
'科目': ['数学成绩', '数学成绩', '英语成绩', '英语成绩', '物理成绩', '物理成绩'],
'成绩': [90, 91, 85, 86, 92, 93]
}
df_long = pd.DataFrame(data)
print(f"包含重复值的长格式数据集: \n{df_long}")
# 使用 pivot_table 方法处理重复值
df_pivoted = df_long.pivot_table(index='姓名', columns='科目', values='成绩', aggfunc='mean')
print(f"使用 pivot_table 方法处理重复值后的数据集 (宽格式): \n{df_pivoted}")
实践
将宽格式数据转换为长格式数据。
# 导入 Pandas 库
import pandas as pd
# 创建示例数据集(宽格式)
data = {
'姓名': ['张三', '李四', '王五'],
'数学成绩': [90, 85, 92],
'英语成绩': [88, 92, 89],
'物理成绩': [95, 88, 90]
}
df = pd.DataFrame(data)
print(f"原始数据集 (宽格式): \n{df}")
# 使用 melt 方法将宽格式数据转换为长格式数据
df_melted = df.melt(id_vars='姓名', value_vars=['数学成绩', '英语成绩', '物理成绩'],
var_name='科目', value_name='成绩')
print(f"使用 melt 方法转换后的数据集 (长格式): \n{df_melted}")
# 使用 pivot 方法将长格式数据转换回宽格式数据
df_pivoted = df_melted.pivot(index='姓名', columns='科目', values='成绩')
print(f"使用 pivot 方法转换后的数据集 (宽格式): \n{df_pivoted}")
# 创建包含多个值的示例数据集
data = {
'姓名': ['张三', '张三', '李四', '李四', '王五', '王五'],
'科目': ['数学成绩', '英语成绩', '数学成绩', '英语成绩', '数学成绩', '英语成绩'],
'成绩': [90, 88, 85, 92, 92, 89],
'学期': ['第一学期', '第一学期', '第一学期', '第一学期', '第一学期', '第一学期']
}
df_long = pd.DataFrame(data)
print(f"包含多个值的长格式数据集: \n{df_long}")
# 使用 pivot 方法将长格式数据转换为宽格式数据
df_pivoted = df_long.pivot(index='姓名', columns='科目', values='成绩')
print(f"使用 pivot 方法转换后的数据集 (宽格式): \n{df_pivoted}")
# 创建包含重复值的示例数据集
data = {
'姓名': ['张三', '张三', '李四', '李四', '王五', '王五'],
'科目': ['数学成绩', '数学成绩', '英语成绩', '英语成绩', '物理成绩', '物理成绩'],
'成绩': [90, 91, 85, 86, 92, 93]
}
df_long = pd.DataFrame(data)
print(f"包含重复值的长格式数据集: \n{df_long}")
# 使用 pivot_table 方法处理重复值
df_pivoted = df_long.pivot_table(index='姓名', columns='科目', values='成绩', aggfunc='mean')
print(f"使用 pivot_table 方法处理重复值后的数据集 (宽格式): \n{df_pivoted}")
小结
通过今天的练习,你应该已经掌握了如何使用 Pandas 进行数据重塑,包括 melt 方法和 pivot 方法。melt 方法用于将宽格式数据转换为长格式数据,而 pivot 方法用于将长格式数据转换为宽格式数据
SQL 和 Pandas
目标
学会使用 SQL 查询 Pandas DataFrame。
学习内容
Pandas 的 query 方法
使用 SQL 语法查询 DataFrame
代码示例
1. 导入必要的库
import pandas as pd
2. 创建示例数据集
# 创建示例数据集
data = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七'],
'部门': ['销售部', '市场部', '技术部', '财务部', '人力资源部'],
'销售额': [120, 150, 130, 140, 160],
'成本': [80, 90, 100, 110, 120]
}
df = pd.DataFrame(data)
print(f"示例数据集: \n{df}")
3. 使用 query 方法
基本查询
# 查询销售额大于 130 的记录
df_query = df.query('销售额 > 130')
print(f"查询销售额大于 130 的记录: \n{df_query}")
使用多个条件
# 查询销售额大于 130 且成本小于 110 的记录
df_query = df.query('销售额 > 130 and 成本 < 110')
print(f"查询销售额大于 130 且成本小于 110 的记录: \n{df_query}")
使用 or 条件
# 查询销售额大于 130 或成本小于 100 的记录
df_query = df.query('销售额 > 130 or 成本 < 100')
print(f"查询销售额大于 130 或成本小于 100 的记录: \n{df_query}")
使用 in 条件
# 查询部门为 '销售部' 或 '市场部' 的记录
df_query = df.query("部门 in ('销售部', '市场部')")
print(f"查询部门为 '销售部' 或 '市场部' 的记录: \n{df_query}")
使用 not in 条件
# 查询部门不是 '销售部' 或 '市场部' 的记录
df_query = df.query("部门 not in ('销售部', '市场部')")
print(f"查询部门不是 '销售部' 或 '市场部' 的记录: \n{df_query}")
使用变量
# 使用变量进行查询
min_sales = 130
df_query = df.query('销售额 > @min_sales')
print(f"查询销售额大于 {min_sales} 的记录: \n{df_query}")
使用 isin 方法
# 使用 isin 方法进行查询
departments = ['销售部', '市场部']
df_query = df[df['部门'].isin(departments)]
print(f"查询部门为 {departments} 的记录: \n{df_query}")
使用 not in 方法
# 使用 not in 方法进行查询
departments = ['销售部', '市场部']
df_query = df[~df['部门'].isin(departments)]
print(f"查询部门不是 {departments} 的记录: \n{df_query}")
实践
使用 SQL 语法查询 DataFrame。
# 导入 Pandas 库
import pandas as pd
# 创建示例数据集
data = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七'],
'部门': ['销售部', '市场部', '技术部', '财务部', '人力资源部'],
'销售额': [120, 150, 130, 140, 160],
'成本': [80, 90, 100, 110, 120]
}
df = pd.DataFrame(data)
print(f"示例数据集: \n{df}")
# 查询销售额大于 130 的记录
df_query = df.query('销售额 > 130')
print(f"查询销售额大于 130 的记录: \n{df_query}")
# 查询销售额大于 130 且成本小于 110 的记录
df_query = df.query('销售额 > 130 and 成本 < 110')
print(f"查询销售额大于 130 且成本小于 110 的记录: \n{df_query}")
# 查询销售额大于 130 或成本小于 100 的记录
df_query = df.query('销售额 > 130 or 成本 < 100')
print(f"查询销售额大于 130 或成本小于 100 的记录: \n{df_query}")
# 查询部门为 '销售部' 或 '市场部' 的记录
df_query = df.query("部门 in ('销售部', '市场部')")
print(f"查询部门为 '销售部' 或 '市场部' 的记录: \n{df_query}")
# 查询部门不是 '销售部' 或 '市场部' 的记录
df_query = df.query("部门 not in ('销售部', '市场部')")
print(f"查询部门不是 '销售部' 或 '市场部' 的记录: \n{df_query}")
# 使用变量进行查询
min_sales = 130
df_query = df.query('销售额 > @min_sales')
print(f"查询销售额大于 {min_sales} 的记录: \n{df_query}")
# 使用 isin 方法进行查询
departments = ['销售部', '市场部']
df_query = df[df['部门'].isin(departments)]
print(f"查询部门为 {departments} 的记录: \n{df_query}")
# 使用 not in 方法进行查询
departments = ['销售部', '市场部']
df_query = df[~df['部门'].isin(departments)]
print(f"查询部门不是 {departments} 的记录: \n{df_query}")
总结
通过今天的练习,你应该已经掌握了如何使用 Pandas 的 query 方法进行类似于 SQL 的查询操作。query 方法提供了一种简洁的方式来筛选 DataFrame 中的数据,支持多种条件和逻辑运算符