如何用Pandas根据患者笔记填充DataFrame的Problem列null值?
用Pandas根据患者笔记填充病情列的空值
先创建示例数据方便测试(你可以替换成自己的DataFrame):
import pandas as pd import numpy as np data = { 'PATIENT_ID': [1, 2, 3, 4, 5], 'Problem': ['KNEE', None, 'ARM', None, None], 'PATİENT NOTE': [ 'Patient complains of knee pain', 'Arm swelling after fall', 'Wrist injury but arm is okay', 'Knee stiffness when walking', 'No specific issues reported' ] } df = pd.DataFrame(data)
方法1:用.loc精准定位赋值(直观易懂)
这种方法适合规则简单的场景,先定位Problem为空且笔记包含指定关键词的行,再赋值:
# 填充KNEE:仅处理Problem为空且笔记含KNEE的行(不区分大小写) df.loc[(df['Problem'].isna()) & (df['PATİENT NOTE'].str.contains('KNEE', case=False)), 'Problem'] = 'KNEE' # 填充ARM:仅处理剩余的Problem为空且笔记含ARM的行 df.loc[(df['Problem'].isna()) & (df['PATİENT NOTE'].str.contains('ARM', case=False)), 'Problem'] = 'ARM'
- 加
case=False是为了匹配大小写不同的关键词(比如knee、Knee),如果需要严格区分大小写,去掉这个参数即可。 - 如果笔记同时出现KNEE和ARM,会优先填充先执行的规则(比如上面的代码会优先填KNEE)。
方法2:用np.where链式判断(一次性处理)
适合把多个判断逻辑整合到一行代码:
df['Problem'] = np.where( # 条件1:Problem为空且笔记含KNEE df['Problem'].isna() & df['PATİENT NOTE'].str.contains('KNEE', case=False), 'KNEE', # 条件2:Problem为空且笔记含ARM,否则保留原Problem值 np.where( df['Problem'].isna() & df['PATİENT NOTE'].str.contains('ARM', case=False), 'ARM', df['Problem'] ) )
方法3:自定义函数+apply(适合复杂规则)
如果之后要加更多关键词(比如ANKLE、BACK),用自定义函数会更易维护:
def fill_problem(row): # 如果Problem已有值,直接返回 if pd.notna(row['Problem']): return row['Problem'] # 统一转大写避免大小写问题 note_upper = row['PATİENT NOTE'].upper() if 'KNEE' in note_upper: return 'KNEE' elif 'ARM' in note_upper: return 'ARM' # 没有匹配关键词时,保留原空值 else: return row['Problem'] df['Problem'] = df.apply(fill_problem, axis=1)
注意事项
- 如果笔记中同时存在多个关键词,上述方法都会按判断顺序优先赋值,你可以根据需求调整关键词的判断顺序。
- 如果空值行的笔记没有匹配到任何关键词,
Problem列会保持原空值。
内容的提问来源于stack exchange,提问作者Batuhan Metin
相关产品推荐
相关产品推荐

