如何使用Pandas根据关联列值条件重命名重复的Hospital列行
嘿,这个需求我刚好有处理经验,用Pandas完全可以搞定!咱们先理清楚逻辑,再一步步写代码实现。
首先,核心思路是:先识别出那些同一个医院对应多个不同科室的行,然后给这些行的医院名称加上区分标识(比如科室名或者序号);而同一个医院只有单一科室的,就保持原名不变。
第一步:构造示例数据(方便你测试)
先模拟一个和你需求匹配的DataFrame,你可以直接替换成自己的数据:
import pandas as pd # 示例数据 data = { 'Hospital': ['A医院', 'A医院', 'B医院', 'B医院', 'C医院'], 'GeneralRepresentation': ['内科', '外科', '内科', '内科', '儿科'] } df = pd.DataFrame(data)
第二步:实现重命名逻辑
这里我提供两种常见的重命名方式,你可以根据自己的需求选:
方式1:医院名称 + 科室名称(最直观)
这种方式会把重复医院但不同科室的行,命名成「医院名-科室名」,比如A医院内科、A医院外科:
# 先计算每个医院对应的不同科室数量,存到临时列里 df['unique_dept_count'] = df.groupby('Hospital')['GeneralRepresentation'].transform('nunique') # 逐行判断,生成新的医院名称 df['New_Hospital'] = df.apply( lambda row: f"{row['Hospital']}-{row['GeneralRepresentation']}" if row['unique_dept_count'] > 1 else row['Hospital'], axis=1 ) # 删掉临时列,保持数据整洁 df = df.drop('unique_dept_count', axis=1)
运行后得到的结果是:
Hospital GeneralRepresentation New_Hospital 0 A医院 内科 A医院-内科 1 A医院 外科 A医院-外科 2 B医院 内科 B医院 3 B医院 内科 B医院 4 C医院 儿科 C医院
方式2:医院名称 + 序号(更简洁)
如果你不想显示科室名,只想用序号区分,比如A医院1、A医院2,可以这么写:
# 给每个医院内的不同科室分配唯一序号 df['dept_rank'] = df.groupby('Hospital')['GeneralRepresentation'].rank(method='dense', ascending=True).astype(int) # 生成新的医院名称 df['New_Hospital'] = df.apply( lambda row: f"{row['Hospital']}{row['dept_rank']}" if row['dept_rank'] > 1 else row['Hospital'], axis=1 ) # 删掉临时列 df = df.drop('dept_rank', axis=1)
运行后结果是:
Hospital GeneralRepresentation New_Hospital 0 A医院 内科 A医院 1 A医院 外科 A医院2 2 B医院 内科 B医院 3 B医院 内科 B医院 4 C医院 儿科 C医院
关键逻辑解释
groupby('Hospital')['GeneralRepresentation'].transform('nunique'):这个方法会给每一行标记出它所属医院的不同科室总数,方便我们快速判断是否需要重命名。apply函数:逐行检查条件,根据是否需要重命名来生成新的医院名称,灵活性拉满,你可以根据自己的需求修改拼接规则(比如用空格、下划线代替横杠)。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

