当前位置: 首页 > news >正文

数据分析:合并

🔷 DA37:统计运动会项目报名人数(仅输出有人报名的项目)

✅ 题目描述

给定两个 CSV 文件:

  • items.csv:包含项目信息(item_id, item_name, location)
  • signup.csv:包含员工报名信息(employee_id, name, sex, department, item_id)

要求:统计每个项目的报名人数,只输出报名人数不为 0 的项目。

💡 即:只要有人报了的项目才显示。


✅ 正确代码

import pandas as pddf_items = pd.read_csv('items.csv', sep=',')
df_signup = pd.read_csv('signup.csv', sep=',')# 内连接合并,自动过滤没有报名记录的项目
df_merge = pd.merge(df_items, df_signup, on='item_id')# 按项目名称分组,统计 employee_id 的数量
result = df_merge.groupby('item_name')['employee_id'].size()print(result)

🔍 代码解析

解释
pd.merge(..., on='item_id')使用 item_id 作为键进行内连接(默认),只有在两个表中都存在的项目才会保留 → 自动排除无人报名的项目
.groupby('item_name')按“项目名称”分组
['employee_id'].size()统计每组中有多少条记录(即报名人数)<br>⚠️ 注意:size() 包括 NaN 值;若用 count() 则会跳过 NaN(更安全)
print(result)输出 Series:索引是项目名,值是人数

✅ 特点:使用 inner join(默认),天然只保留有报名数据的项目。


🧠 扩展知识

知识点说明
merge() 默认行为不指定 how 时,默认为 'inner',即只保留两表共有的 key
groupby().size() vs .count()<ul><li>size():返回每组总行数,包括 NaN</li><li>count():对各列统计非空值个数</li></ul>在此场景下两者等价(employee_id 不为空)
输出格式返回的是一个 Series,打印时自动省略列名,符合题目要求

🔷 DA38:统计运动会项目报名人数(二)—— 包含无人报名的项目

✅ 题目描述

同上,但这次要求:

输出 items.csv 中所有项目的报名人数,即使没人报名也显示为 0。


✅ 正确代码

import pandas as pddf_items = pd.read_csv('items.csv', sep=',')
df_signup = pd.read_csv('signup.csv', sep=',')# 左连接:以 items 为主表,保留所有项目
df_merge = pd.merge(df_items, df_signup, on='item_id', how='left')# 分组并使用 count 统计非空 employee_id 数量
result = df_merge.groupby('item_name')['employee_id'].count()print(result)

🔍 代码解析

关键点解释
how='left'左连接,确保 df_items 中的所有项目都被保留<br>→ 即使没人报名,也会出现在结果中,employee_id 为 NaN
.count()只统计非 NaN 的值 → 无人报名则为 0
groupby('item_name')按项目名聚合
print(result)输出所有项目及其报名人数(含 0)

✅ 核心思想:主表驱动 + left join + count 处理缺失值


🧠 扩展知识

技巧应用场景
left join主表完整、从表补充信息的经典模式(如商品+销量)
fillna(0)如果你想显式补零:df_merge['employee_id'].fillna(0)
reindex()若想确保所有项目按 items.csv 顺序出现,可用 reindex

🔷 DA39:多报名表的运动项目人数统计

✅ 题目描述

新增一个文件 signup1.csv,是另一个部门的报名数据。 要求:将 signup.csvsignup1.csv 合并后,再统计各项目的报名人数(只输出有人报名的)。


✅ 正确代码

import pandas as pditem = pd.read_csv("items.csv", sep=",")
sign = pd.read_csv("signup.csv", sep=",")
sign1 = pd.read_csv("signup1.csv", sep=",")# 上下拼接两个报名表
sign_m = pd.concat([sign, sign1], axis=0)# 与项目表内连接
m = pd.merge(sign_m, item, how="inner", on="item_id")# 按项目名分组,统计员工数量
print(m.groupby("item_name")["employee_id"].count())

🔍 代码解析

步骤说明
pd.concat([sign, sign1], axis=0)将两个报名表纵向堆叠(union),合并成一张大报名表
axis=0沿行方向拼接(上下接)
merge(..., how='inner')只保留存在于 items.csv 中的项目(防止无效 item_id)
groupby().count()统计每个项目的总报名人数(来自两个文件)

✅ 重点:先合并报名数据,再关联项目信息。


🧠 扩展知识

方法用途
pd.concat([...], ignore_index=True)重置行索引,避免重复 index
append() 已弃用推荐使用 concat 替代
去重处理若担心重复报名:sign_m.drop_duplicates(subset=['employee_id', 'item_id'])

🔷 DA40:统计职能部门中报名标枪的员工信息

✅ 题目描述

找出 职能部门(functional) 中报名了 标枪(javelin) 的所有员工,并输出他们的:

  • employee_id
  • name
  • sex

⚠️ 注意:结果要重置索引(从 0 开始连续编号)


✅ 正确代码

import pandas as pd df1 = pd.read_csv("items.csv", sep=',')
df2 = pd.read_csv("signup.csv", sep=',')# 先合并项目和报名信息
df = pd.merge(df1, df2, on='item_id')# 筛选条件:部门是 functional,项目是 javelin
df_fun = df[(df.department == 'functional') & (df.item_name == "javelin")]# 选择指定列并重置索引
result = df_fun[["employee_id", "name", "sex"]].reset_index(drop=True)print(result)

🔍 代码解析

步骤说明
pd.merge(..., on='item_id')获取每个报名记录对应的项目名称
(df.A == X) & (df.B == Y)多条件筛选,注意括号和 &(不能用 and
df[[...]]选取特定列
.reset_index(drop=True)重新生成从 0 开始的整数索引,丢弃原索引

✅ 输出是一个 DataFrame,结构清晰。


🧠 扩展知识

技术点提示
条件逻辑运算符<ul><li>&:且</li><li>&#124;:或</li><li>~:非</li></ul>必须加括号!
字符串匹配若不确定拼写可用:<br>df.item_name.str.contains('javelin', case=False)
query() 方法更简洁的筛选方式:<br>df.query("department == 'functional' and item_name == 'javelin'")
drop=True避免旧索引变成新列

📚 总结对比表(四题核心差异)

题号目标关键操作连接方式聚合/筛选
DA37有人报名的项目人数merge + groupby + sizeinner (default)只输出有数据的
DA38所有项目(含0人)merge + left + countleft显示0人项目
DA39多报名表汇总concat + merge + countinner合并多个源数据
DA40特定人群信息查询merge + 多条件筛选 + 列选择inner输出明细数据

🛠️ 通用技巧总结

场景推荐做法
合并多个 CSV 报名表pd.concat([df1, df2], axis=0)
关联项目信息pd.merge(..., on='item_id')
统计数量groupby().size() 或 .count()
保留主表全部数据how='left'
筛选满足多个条件的数据(cond1) & (cond2)
输出前清理索引.reset_index(drop=True)
防止拼写错误检查字段名:df.columns.tolist()

✅ 学习建议

  1. 动手实践:把这几道题的数据自己构造出来跑一遍。
  2. 理解 merge 类型:inner/left/right/outer 的区别是关键。
  3. 掌握 groupby 和 count/size:数据分析最常用组合。

文章转载自:

http://xU9i2eRv.crqbt.cn
http://C4rbnOPz.crqbt.cn
http://9MObZE2q.crqbt.cn
http://yP2OtzWi.crqbt.cn
http://v3U8Icg8.crqbt.cn
http://x6n9opvK.crqbt.cn
http://ZgkZksIV.crqbt.cn
http://pLjUMhkG.crqbt.cn
http://lRR6SFoF.crqbt.cn
http://kKjd4Ec2.crqbt.cn
http://jqHlYI2j.crqbt.cn
http://2815r0mg.crqbt.cn
http://DyLw5qvb.crqbt.cn
http://0NhlzTut.crqbt.cn
http://9a1do1JM.crqbt.cn
http://y47kr4Rt.crqbt.cn
http://OobHrHc8.crqbt.cn
http://lfKNGKkE.crqbt.cn
http://GZcOu1jr.crqbt.cn
http://m0tYlGGD.crqbt.cn
http://C6SQkkHt.crqbt.cn
http://EXjTE4yA.crqbt.cn
http://KRUjjxaB.crqbt.cn
http://xsfUqfKH.crqbt.cn
http://dh7W48qR.crqbt.cn
http://8VkJdpgo.crqbt.cn
http://IfqxBD5y.crqbt.cn
http://nnNFIrdx.crqbt.cn
http://6l7691S4.crqbt.cn
http://g9nMAg1a.crqbt.cn
http://www.dtcms.com/a/379085.html

相关文章:

  • bug:uniCloud报Business Failed, 参数有误retry invoke error
  • 人工智能学习:Transformer结构中的子层连接(Sublayer Connection)
  • 阿里FunASR语音转文字模型搭建
  • Android8 binder源码学习分析笔记(三)
  • sizeof 和 strlen
  • 2025年度4款录音转文字工具横向对比
  • 教资科三【信息技术】— 学科知识(简答题)精简背诵版
  • 滚动列表展示跟随弹框效果
  • readelf 和 ldd 查看文件的依赖
  • 基于社交媒体数据的公众情绪指数构建与重大事件影响分析
  • Cosign 实战:构建可信容器镜像的签名与验证体系
  • 定时器实战:LED闪烁与呼吸灯调试
  • docker部署Gitlab社区版,步骤以及外网访问出现502的解决方式
  • FairGuard aab包签名工具
  • 企业文件图纸全自动加密怎么设置?三步实现自动防护!
  • Redis C++ 实现笔记(I篇)
  • [css] 实现禁止文本被选中
  • MATLAB中进行视觉检测入门教程
  • 人工智能深度学习——多层感知器(人工神经网络)
  • 2025最新超详细FreeRTOS入门教程:第十二章 FreeRTOS调度器与时间片管理
  • 软考系统架构设计师之项目管理篇
  • OpenSTL PredRNNv2 模型复现与自定义数据集训练
  • 基于STM32的单片机开发复盘
  • Git 目录详解和基本操作(1)
  • 机器学习之K折交叉验证
  • Android Gradle Project (AGP) gradle-xxxx-src.zip无法正常下载问题解决方法
  • 图观 应用编辑器 产品介绍
  • 探讨Hyperband 等主要机器学习调优方法的机制和权衡
  • Apple产品发布会拆解:体验下放、设计极限、AI 入耳
  • 如何解决 Spring Bean 循环依赖