Python Pandas处理医疗数据集:按Case ID与就诊日期生成就诊编号列
Python: 为同一病例的就诊记录按日期生成就诊编号
嘿,我来帮你搞定这个需求!你需要给每个Case ID#下的就诊记录按日期顺序生成类似Visit 1、Visit 2的编号列,用Pandas就能轻松实现,步骤如下:
第一步:确保日期列是正确的datetime类型
首先得把你的Visit Date列转换成datetime格式,不然字符串排序会出问题(比如"10/1/18"会被排在"2/1/18"前面):
import pandas as pd # 假设你的DataFrame叫df df['Visit Date'] = pd.to_datetime(df['Visit Date'])
第二步:分组生成就诊编号
这里有两种实用的方法,你可以根据需求选:
方法一:用cumcount(简单直接)
先按Case ID#和Visit Date排序,确保同一病例的记录按日期顺序排列,然后用cumcount()给每组计数(从0开始,所以加1),最后拼接成需要的格式:
# 先排序,保证顺序正确 df = df.sort_values(['Case ID#', 'Visit Date']) # 分组计数并生成编号 df['NEW_COL'] = df.groupby('Case ID#').cumcount() + 1 df['NEW_COL'] = 'Visit ' + df['NEW_COL'].astype(str)
方法二:用rank(无需提前排序)
如果不想改变原DataFrame的行顺序,可以用groupby结合transform和rank,直接在原数据上生成编号:
df['NEW_COL'] = df.groupby('Case ID#')['Visit Date'].transform( lambda x: 'Visit ' + str(int(x.rank(method='first'))) )
这里的method='first'是为了处理同一天有多条就诊记录的情况——它会按照记录在原数据中的先后顺序给它们编号,避免出现相同的排名。
示例效果
用你给出的样例数据测试:
原始数据:
Visit Date Case ID# 1/1/18 1111 1/15/18 1111 1/16/18 2222
处理后会得到:
| Visit Date | Case ID# | NEW_COL |
|---|---|---|
| 1/1/18 | 1111 | Visit 1 |
| 1/15/18 | 1111 | Visit 2 |
| 1/16/18 | 2222 | Visit 1 |
小提示
- 如果你的数据中有同一天的多条就诊记录,两种方法都会按顺序给它们分配连续的编号(比如
Visit 1、Visit 2) - 要是不需要保留原数据的顺序,方法一更高效直观;如果要保持原顺序,方法二更合适
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

