1:1病例对照匹配的Python实现步骤详解

这周接到一个活,因为某个课题研究需要,须把脑卒中患者的名单和一份健康人(对照)名单按照”性别相同,乡镇地址相同,年龄相差3岁以内“作为匹配条件进行1:1的匹配,现将思考及实现的过程逐一记录并在此分享,希望能给大家有所借鉴与帮助。 拿到这份数据后首要的工作是熟悉数据和提取关键信息。这两份数据都...
摘要由CSDN通过智能技术生成

这周接到一个活,因为某个课题研究需要,须把脑卒中患者的名单和一份健康人(对照)名单按照”性别相同,乡镇地址相同,年龄相差3岁以内“作为匹配条件进行1:1的匹配,现将思考及实现的过程逐一记录并在此分享,希望能给大家有所借鉴与帮助。

拿到这份数据后首要的工作是熟悉数据和提取关键信息。这两份数据都是保存于Excel中的单表结构的数据(没有复杂的表关联),脑卒中患者1300多条,健康人8200多条,做1:1匹配绰绰有余;主索引采用身份证号,关键信息有”姓名、性别、年龄和乡镇地址“。然后考虑输出的结果的格式,Excel,表单中列入脑卒中患者的全部数据,最后增加一列存放匹配的对照者身份证号。

接下来开始动手编程,第一步引用pandas导入数据。其中路径前的"r"和中文前的"u"不可少,可能是因为我还在用Python2的关系。

# -*- coding: gbk -*-
#!/usr/bin/env python
# __author__ = 'PanJin'

import pandas as pd
case=pd.read_excel(r'D:\并发症数据库(实验室检测筛选).xls',sheet_name=u'心脑')
ctrl=pd.read_excel(r'D:\并发症数据库(实验室检测筛选).xls',sheet_name=u'对照(不包含肿瘤)')

动手分析之前一直有个担心,作为索引的身份证号是否会有重复的记录,果然我的担心应验了,查重发现健康个案的身份证号有4组是重复的(在Excel里用公式查的,所以没有上代码),同时发现8000多人中有部分因为失访,检查结果有大量缺失,于是和重复的身份证号进行了删除。(代码中的身份证号进行了脱敏处理)

ctrl_=ctrl[(ctrl.sfzh !='33042119320221####') & (ctrl.sfzh !='33072219560522####') & (ctrl.sfzh !='33042119381031####') & (ctrl.sfzh !='33042119390824####') & (ctrl.HDLC2 !='#NULL!')]

刚开始打算用pandas里的merge直接解决战斗的,但是发现问题想的太简单了,因为根据匹配条件”性别相同,乡镇地址相同,年龄相差3岁以内“,直接merge的结果一定会有很多一对多甚至多对多的笛卡尔积产生,而对这些笛卡尔积好像没有太好的自动化处理方案,因此我在开始就放弃了这种尝试。所以我的计划是采用Python里的for循环来解决。

解题思路如下:

首先从脑卒中患者清单中取第一条,在健康对照中按条件匹配所有适合的名单,然后取第一条(或者调用random函数来随机一下),已匹配的健康对照从大名单中删除,然后进行再取第二条脑卒中患者重复以上过程直至循环到最后。最终将形成3个名单,1.匹配完成名单;2.患者未匹配名单;3.健康对照未匹配名单。

另外考虑匹配优化的问题,我把这个循环分成了两轮,第一轮中匹配条件为”性别相同,乡镇地址相同,年龄相等“,第二轮中为”性别相同,

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值