如何检测多个字符串中是否存在多个子字符串,并创建一个标记它们的新变量?

时间:2019-10-06 17:36:11

标签: python-3.x pandas

我正在尝试从STATA转换为python,并在python中重新创建一些以前的工作/代码。我有一个包含5个变量,1个患者ID号和4个ICD-9外部伤害代码(称为电子代码)的数据集。 (但超过1000行,因此手动输入确实可行)。

我想创建一个变量,该变量将人识别为是堕落者还是非堕落者,用电子代码880.XX-889.xx标识。 Python将它们视为对象。

我想要一个变量,该变量指示患者是否在4个ecode变量(值1)中的任何一个中都具有代码E880.xx-E888.xx,如果他们没有E880.xx-E888.xx代码给他们一个0的值,但是如果缺少4个电子代码值,就不要给他们一个值(编码为缺失),因为它们没有受到外部伤害。

在STATA中,代码向前挺直:

gen fall_inj_ecode=0  
foreach var in ecode1 ecode2 ecode3 ecode4{  
replace fall_inj_ecode=1 if strpos(`var', "E880")>0
replace fall_inj_ecode=1 if strpos(`var', "E881")>0
replace fall_inj_ecode=1 if strpos(`var', "E882")>0
replace fall_inj_ecode=1 if strpos(`var', "E883")>0
replace fall_inj_ecode=1 if strpos(`var', "E884")>0
replace fall_inj_ecode=1 if strpos(`var', "E885")>0
replace fall_inj_ecode=1 if strpos(`var', "E886")>0
replace fall_inj_ecode=1 if strpos(`var', "E887")>0
replace fall_inj_ecode=1 if strpos(`var', "E888")>0

请注意,有些子代码(因此带有“ .xx”部分)没有句号。因此,代码E8801被认为介于880.xx和889.xx之间,表示坠落伤害。

对于STATA来说,幸运的是,如果ecode值丢失或为空,它将自动填充以将新变量标记为丢失,我不确定python是否是这种情况。不幸的是,这就是我被困住的地方。在网上搜索后,我似乎找不到与Python等效的代码的任何示例。任何帮助将不胜感激

这是数据的前10行左右的图像,以及我试图使它看起来像(蓝色)的图像: Example of what the output should be

链接到我的Github存储库,以方便您使用.csv文件。

我想我已经解决了一些问题。如果我能够创建4个新的ecode变量,将代码E880.xx-E888.xx标记为下降(值1),并将其他所有值都设置为0,那么我可以创建第五个变量,该变量将4个新变量。如果该新变量的值等于或大于1,那么我会知道代码中有跌倒伤害。

pd1011['fall_injury'] = pd1011['ecodep_pdfall'] + pd1011['ecode1_pdfall'] + pd1011['ecode2_pdfall'] + pd1011['ecode3_pdfall'] + pd1011['ecode4_pdfall']

fall_dictionary = { 0 : 'Non-Fall',
                   1 : 'Fall Injury'}

pd1011['fall_injury'] = pd1011.apply(lambda x: fall_dictionary.get(x['fall_injury']), axis=1)

但是,我不确定如何将整数值分配给对象。

此外,如果任何人有任何有用的资源(例如书籍,网站,教科书等),请告诉我!

0 个答案:

没有答案