如何用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
相关产品推荐
相关产品推荐

