数据分析:合并二

DA41 运动会各项目报名透视表

📌 题目描述
  • 有两个 CSV 文件:
    • items.csv:项目信息(item_id, item_name, location
    • signup.csv:员工报名信息(employee_id, name, sex, department, item_id
  • 要求输出一个透视表 ,展示:
    • 行索引:sex(性别)、department(部门)
    • 列索引:item_name(项目名称)
    • 值:报名人数(统计 employee_id 的数量)
  • 不包含没人报名的项目
✅ 代码实现
复制代码
import pandas as pd

# 读取数据
items = pd.read_csv('items.csv')
signup = pd.read_csv('signup.csv')

# 合并两个表,获取项目名称
merged = pd.merge(signup, items, on='item_id', how='inner')

# 创建透视表
pivot = pd.pivot_table(
    merged,
    index=['sex', 'department'],          # 多级行索引
    columns=['item_name'],                 # 列为项目名
    values='employee_id',                  # 统计员工ID
    aggfunc='count',                       # 聚合方式:计数
    fill_value=0                           # 缺失值填0
)

print(pivot)
🔍 解析
  1. 为什么用 merge

    • 因为 signup 表只有 item_id,没有项目名称,必须通过 items.csv 获取 item_name
    • 使用 inner join 自动过滤掉"没人报名"的项目(因为 signup 中没有对应记录)
  2. pivot_table 参数详解:

    • index: 行分组字段(支持多级)
    • columns: 列分组字段(会变成列名)
    • values: 要聚合的列(这里是 employee_id
    • aggfunc='count': 统计每组中非空的 employee_id 数量 → 即报名人数
    • fill_value=0: 将 NaN 替换为 0,表格更美观
  3. 输出示例(示意):

    复制代码
    item_name        longJump  run100m  swim50m
    sex  department                           
    男    tech               2        1        0
    女    education          1        0        3
⚠️ 常见错误
  • 忘记合并表 → 缺少 item_name
  • outer join → 可能引入无意义项目
  • 不指定 values → 默认会对所有数值列聚合,导致错误

DA42 合并用户信息表与用户活跃表(简单)

📌 题目描述
  • 有两个用户表:
    • Nowcoder1.csv:用户基本信息(ID, 名字, 等级, 刷题量等)
    • Nowcoder2.csv:用户活跃数据(ID, 签到天数, 提交次数, 最后提交时间)
  • 要求通过 Nowcoder_ID 合并两张表,输出完整信息
✅ 代码实现
复制代码
import pandas as pd

# 设置显示选项
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 300)

# 读取数据
df1 = pd.read_csv('Nowcoder1.csv')
df2 = pd.read_csv('Nowcoder2.csv')

# 内连接合并
merged = pd.merge(df1, df2, on='Nowcoder_ID', how='inner')

print(merged)
🔍 解析
  1. 为什么要用 inner join

    • 题目要求"合并输出",隐含意思是只保留两张表都有的用户
    • 如果某个用户只在一张表中有数据,可能是异常或未活跃用户,不输出也合理
  2. how='inner' vs how='left'

    • inner: 只保留两表共有的用户
    • left: 保留所有 df1 的用户,df2 没有的字段填 NaN
    • 本题推荐 inner,因为"完整表格"意味着两部分信息都要有
  3. 显示设置说明:

    • max_columns=None: 防止列太多被省略
    • width=300: 让输出更宽,避免换行

DA43 两份用户信息表格中的查找(简单)

📌 题目描述
  • 同样是两个用户表(Nowcoder1.csv, Nowcoder2.csv
  • 要求输出:用户名、刷题量、代码提交次数
✅ 代码实现
复制代码
import pandas as pd

# 设置显示
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 300)

# 读取
df1 = pd.read_csv('Nowcoder1.csv')
df2 = pd.read_csv('Nowcoder2.csv')

# 左连接合并
merged = pd.merge(df1, df2, on='Nowcoder_ID', how='left')

# 提取需要的三列
result = merged[['Name', 'Num_of_exercise', 'Number_of_submissions']]

print(result)
🔍 解析
  1. 为什么用 left join

    • 目标是输出"用户的名字和刷题量"------这些都在 df1
    • "代码提交次数"在 df2 中,但不要求每个用户都有
    • 所以保留 df1 所有用户,df2 没有的提交次数显示为 NaN0
  2. 与 DA42 的区别:

    题目 目的 推荐 how
    DA42 输出完整用户信息 inner
    DA43 输出特定字段,允许缺失 left
  3. 列选择技巧:

    复制代码
    result = merged[['Name', 'Num_of_exercise', 'Number_of_submissions']]
    • 使用双层中括号 [[...]] 选择多列
    • 返回的是 DataFrame,不是 Series

🧠 扩展知识点总结

1. pd.merge()how 参数对比

类型 说明 使用场景
inner 交集:只保留两表都有的键 数据完整性要求高
left 左表全保留,右表匹配 分析主表 + 补充信息
right 右表全保留 较少用
outer 并集:保留所有键 全量分析,容忍缺失

2. pivot_table 核心参数

参数 作用
index 行分组字段(可多级)
columns 列分组字段(变成列名)
values 要聚合的列
aggfunc 聚合函数('count', 'sum', 'mean' 等)
fill_value 填充缺失值(如 0

3. 读取 CSV 的 sep 问题(回顾)

复制代码
pd.read_csv('data.csv')  # 默认 sep=','(英文逗号)
pd.read_csv('data.tsv', sep='\t')  # 制表符分隔必须指定
  • ❌ 错误:sep=','(中文逗号)
  • ✅ 正确:sep=',' 或不写(默认)

✅ 学习建议

  1. 理解业务逻辑再选 how

    • 要不要保留没活跃的用户?→ 决定用 left 还是 inner
  2. 多用 pivot_table 做报表

    • groupby + unstack 更直观
  3. 打印前设置显示选项

    复制代码
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
  4. 先合并再筛选列

    • mergeselect columns 是标准流程

🎯 总结口诀

"合并看需求,inner 保完整,left 保主表;
透视用 pivot,index 行,columns 列,count 统人数。"

相关推荐
老白干2 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂10 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study10 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境11 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境11 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12311 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021611 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0012 小时前
一个项目带你入门AI应用开发01
python