如何从单独列中的字符串中提取特定代码?

2024-05-15 16:24:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格式的数据

Data

Data Sample Excel

我想从“诊断”列中提取代码,并将每个代码粘贴到“诊断”列后的单独列中。我知道用来匹配这个的正则表达式是

[A-TV-Z][0-9][0-9AB]。?[0-9A-TV-Z]{0,4}

资料来源:https://www.johndcook.com/blog/2019/05/05/regex_icd_codes/

这些代码称为ICD10代码,如Z01.2、E11等。上述表达式旨在匹配所有ICD10代码

但是我不知道如何在python代码中使用这个表达式来完成上述任务

我想解决的问题是

  1. 计算为所有患者分配的代码总数
  2. 计算分配的唯一代码总数(因为多个患者可能分配了相同的代码)
  3. 按代码生成数据-即,如果我选择代码Z01.2,我希望提取已分配此代码的患者数据(可能是患者ID、手机号码或任何其他列或所有)

提前谢谢


Tags: 数据sample代码https患者data表达式粘贴
1条回答
网友
1楼 · 发布于 2024-05-15 16:24:59

使用Python的方法如下

代码

import pandas as pd
import re

df = pd.read_csv("data.csv", delimiter='\t')

pattern = '([A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4})'

df['CODES'] = df['DIAGNOSIS'].str.findall(pattern)

df['Length'] = df['CODES'].str.len()

print(f"Total Codes: {df['Length'].sum()}")

all_codes = df['CODES'].sum()#.set()
unique_codes = set(all_codes)
print(f'all codes {all_codes}\nCount: {len(all_codes)}')
print(f'unique codes {unique_codes}\nCount: {len(unique_codes)}')

# Select patients with code Z01.2
patients=df[df['CODES'].apply(', '.join).str.contains('Z01.2')]
# Show selected columns
print(patients.loc[:, ['PATID', 'PATIENT_NAME', 'MOBILE_NUMBER']])

解释

以制表符分隔的CSV格式导入的数据

import pandas as pd
import re
df = pd.read_csv("data.csv", delimiter='\t'

结果数据帧df

  PATID PATIENT_NAME  MOBILE_NUMBER  EMAIL_ADDRESS GENDER PATIENT_AGE  \
0     11          Mac          98765  ab1@gmail.com      F        51 Y   
1     22          Sac          98766  ab1@gmail.com      F        24 Y   
2     33          Tac          98767  ab1@gmail.com      M        43 Y   
3     44          Lac          98768  ab1@gmail.com      M        54 Y   

  DISTRICT   CLINIC                                          DIAGNOSIS  
0     Mars  Clinic1  Z01.2 - Dental examinationC50 - Malignant neop...  
1     Moon  Clinic2  S83.6 - Sprain and strain of other and unspeci...  
2    Earth  Clinic3  K60.1 - Chronic anal fissureZ20.9 - Contact wi...  
3   Saturn  Clinic4  E11 - Type 2 diabetes mellitusE78.5 - Hyperlip... 

使用指定的模式从诊断列中提取

在前面添加转义字符。否则,它将是一个通配符并匹配任何字符(提供的数据没有差异)

pattern = '([A-TV-Z][0-9][0-9AB]\.?[0-9A-TV-Z]{0,4})'
df['CODES'] = df['DIAGNOSIS'].str.findall(pattern)

df['code']列中的每一行都是代码列表

0                              [Z01.2, C50 , Z10.0]
1                             [S83.6, L05.0, Z20.9]
2                       [K60.1, Z20.9, J06.9, C50 ]
3    [E11 , E78.5, I10 , E55 , E79.0, Z24.0, Z01.2]

Name: CODES, dtype: object

将长度列添加到df数据帧

df['Length'] = df['CODES'].str.len()

df['Length']对应于每个代码列表的长度

0    3
1    3
2    4
3    7

Name: Length, dtype: int64

使用的代码总数是代码长度的总和

df['Length'].sum()

代码总数:17

用于连接所有代码列表的所有代码

all_codes = df['CODES'].sum()

['Z01.2', 'C50 ', 'Z10.0', 'S83.6', 'L05.0', 'Z20.9', 'K60.1', 'Z20.9', 'J06.9', 'C50
 ', 'E11 ', 'E78.5', 'I10 ', 'E55 ', 'E79.0', 'Z24.0', 'Z01.2']

计数:17

使用的唯一代码取所有代码列表的set()

unique_codes = set(all_codes)

{'L05.0', 'S83.6', 'E79.0', 'Z01.2', 'I10 ', 'J06.9', 'K60.1', 'E11 ', 'Z24.0', 'Z
10.0', 'E55 ', 'E78.5', 'Z20.9', 'C50 '}

Count: 14

按代码选择患者(即Z01.2)

patients=df[df['CODES'].apply(', '.join).str.contains('Z01.2')]

显示这些患者的患者姓名和手机号码

print(patients.loc[:, ['PATID', 'PATIENT_NAME', 'MOBILE_NUMBER']])

结果

   PATID PATIENT_NAME  MOBILE_NUMBER
0     11          Mac          98765
3     44          Lac          98768

相关问题 更多 >