医数智联·第 15 期:pandas 入门 —— 首页数据的「Excel 终结者」,DataFrame 10 大操作
医数智联·第 15 期:pandas 入门 —— 首页数据的「Excel 终结者」,DataFrame 10 大操作
[!ABSTRACT] 核心摘要
- 本期主题:pandas 入门——把首页数据从「Excel 重活」变成「pandas 5 行代码」
- 核心结论:pandas = Python 版的 Excel,但比 Excel 强大 10 倍
- 核心数据结构:DataFrame(类似 Excel 工作表)+ Series(类似 Excel 一列)
- 10 大必会操作:读 / 写 / 筛选 / 排序 / 分组 / 聚合 / 合并 / 透视 / 缺失值 / 日期
- 典型效果:把 2 小时的 Excel 工作压成 5 行 Python 代码
- 阅读时长:约 10 分钟
一、场景引入:Excel 的「复杂公式噩梦」
[!example] 一个真实的周三下午
质管办小李要算「上月每个科室的主诊错误率」,他打开 Excel:
- 筛选:
筛选 → 骨科 → 复制 → 新 sheet- 计数:
COUNTIF(B:B, "骨科")算出骨科总数- 错误数:
COUNTIFS(B:B, "骨科", C:C, 1)算出骨科错误数- 错误率:
=错误数/总数,4 个科室,公式拉 4 次- 再加新科室:5 个、6 个……公式改 8 次,每次都重新拉
- 数据更新:新增 100 行 → 所有公式重新覆盖
1 小时后,他算完了,但主任又问「按职称分组呢?按医生呢?」
他想哭。
这是 Excel 复杂分析的典型困境——逻辑一变,公式全乱。
[!quote] 狼叔的判断
“Excel 适合’最后一步’,pandas 适合’前面 90%’。” 这一期,带你掌握 pandas 的 10 大必会操作,把 2 小时压成 5 行代码。
二、工具原理:pandas 是什么?
2.1 pandas 是什么?
[!info] pandas 简介
pandas 是 Python 的数据分析库,Excel 的「超进化版」。江湖地位:
- Python 数据分析 #1 库(90% 数据分析师的首选)
- 医院数据场景 覆盖率最高(首页处理 / DRG 分析 / 报表自动化)
2.2 核心数据结构
1 | ┌─────────────────────────────────────────┐ |
2.3 pandas vs Excel 对照表
| 概念 | Excel | pandas |
|---|---|---|
| 工作簿 | .xlsx 文件 |
不存在(内存中) |
| 工作表 | sheet | DataFrame |
| 一列 | 列(如 A 列) | Series |
| 一行 | 一条记录 | DataFrame.loc[i] |
| 筛选 | 筛选 |
df[df['列'] == 值] |
| 排序 | 排序 |
df.sort_values() |
| 分类汇总 | 数据透视表 |
df.pivot_table() |
| VLOOKUP | VLOOKUP() |
df.merge() |
| 公式 | =A1+B1 |
df.eval() |
三、医院实战:10 大必会操作
3.1 操作 1:读 Excel(读)
1 | import pandas as pd |
[!tip] 读 CSV 用
pd.read_csv(),读 SQL 用pd.read_sql(),几乎所有数据源都能读。
3.2 操作 2:写 Excel(写)
1 | # 写回 Excel |
3.3 操作 3:筛选(按条件选行)
1 | # 单条件:选骨科 |
3.4 操作 4:排序(按值排)
1 | # 按错误分值降序 |
3.5 操作 5:分组(groupby)+ 聚合
1 | # 按科室分组,统计每组的错误数 |
典型输出:
1 | 科室 总病案数 错误数 平均住院日 错误率_百分比 |
3.6 操作 6:合并(merge,代替 VLOOKUP)
1 | # 主页表 + 诊断表(按病案号合并) |
how 参数 |
含义 |
|---|---|
inner |
内连接,只保留匹配的 |
left |
左连接,保留左表所有 |
right |
右连接,保留右表所有 |
outer |
全连接,保留所有 |
3.7 操作 7:数据透视表(pivot_table)
1 | # Excel 数据透视表的 pandas 版本 |
典型输出:
1 | 职称 主治医师 副主任 主任医师 |
3.8 操作 8:缺失值处理
1 | # 检查缺失值 |
3.9 操作 9:日期处理
1 | # 转日期类型 |
3.10 操作 10:apply 函数(自定义处理)
1 | # 给每行打标签:错误分值 >= 80 的标「重大」 |
四、避坑指南:5 个让新手”踩雷”的常见错误
[!warning] 雷区 ①:列名带空格
症状:df['主诊 ICD']报错,或选不到列。
原因:pandas 列名严格匹配,空格也算字符。
解决:读入后立即清洗列名:
1 df.columns = df.columns.str.strip().str.replace(' ', '')
[!warning] 雷区 ②:数据类型不对
症状:df['主诊错误标记'].sum()返回奇怪结果。
原因:错误标记是object类型(字符串),不是数字。
解决:先转换类型:
1 df['主诊错误标记'] = df['主诊错误标记'].astype(int)
[!warning] 雷区 ③:groupby 后忘了 reset_index
症状:df_grouped['科室']报错 KeyError。
原因:groupby 后索引变成「分组字段」,普通列名失效。
解决:加.reset_index():
1 df_grouped = df.groupby('科室').sum().reset_index()
[!warning] 雷区 ④:合并时主键重复
症状:merge后行数暴增。
原因:右表主键有重复,1 对多 → 行数变成 N 倍。
解决:先去重:
1 df_诊断去重 = df_诊断.drop_duplicates(subset=['病案号'])
[!warning] 雷区 ⑤:链式赋值 SettingWithCopyWarning
症状:df[df['科室']=='骨科']['主诊'] = 'XXX'报警告。
原因:pandas 不知道你想改原数据还是副本。
解决:用.loc:
1 df.loc[df['科室']=='骨科', '主诊'] = 'XXX'
五、下期预告
[!quote] 第 16 期
matplotlib 入门:质控图表自动生成 —— 4 类核心图表这一期,带你用 Python 自动画图,把首页数据可视化:柱状图、折线图、饼图、热力图,告别手动画图。
[!TIP] 互动
如果你觉得这篇「医数智联·第 15 期」对你有用,请点赞、在看、转发给科里的同事。我是白衣狼,一个用数字化工具把医院管理做「轻」的实战派。咱们下期见。





