You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas基于分类列生成新列,统计医生各药物开药数量?

按医生统计各药物开具数量的实现方法

数据集

import pandas as pd

df = pd.DataFrame({"doctor id": ["1", "1", "1", "1"],
                   "patient id": ["1", "2", "3", "4"],
                   "drug name": ["a", "b", "b", "b"]})

需求

基于drug name列创建drug_a_count和drug_b_count两个新列,统计每位医生给患者开具的每种药物的数量,理想输出如下:

doctor id  drug_a_count  drug_b_count
0         1             1             3

当前尝试的代码及结果

你当前使用的代码:

df.groupby(['doctor id','drug name'])["doctor id"].count().reset_index(name="count")

得到的输出是长表形式,不符合需求:

doctor id drug name  count
0         1         a      1
1         1         b      3

正确实现方法

方法1:使用pivot_table

pivot_table可以直接实现分组统计并将分类列转为表头,代码如下:

# 生成透视表,按医生分组,药物名称为列,统计患者ID的数量
result = df.pivot_table(
    index='doctor id',
    columns='drug name',
    values='patient id',
    aggfunc='count',
    fill_value=0  # 填充缺失值为0
)

# 重命名列名以符合需求
result = result.rename(columns={'a': 'drug_a_count', 'b': 'drug_b_count'}).reset_index()

print(result)

方法2:groupby + unstack

先通过groupby统计数量,再用unstack将行转为列:

# 分组统计数量
grouped = df.groupby(['doctor id', 'drug name'])['patient id'].count()
# 将drug name的行转为列,缺失值填充为0
grouped = grouped.unstack(fill_value=0)
# 重命名列并重置索引
grouped = grouped.rename(columns={'a': 'drug_a_count', 'b': 'drug_b_count'}).reset_index()

print(grouped)

两种方法都能得到符合要求的宽表输出。

内容的提问来源于stack exchange,提问作者Chubaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:45:28