我有一个专栏,里面有很多博士专业。我想清理它并在下面创建一个函数:
def specialty(x):
if x.str.contains('Urolog'):
return 'Urology'
elif x.str.contains('Nurse'):
return 'Nurse Practioner'
elif x.str.contains('Oncology'):
return 'Oncology'
elif x.str.contains('Physician'):
return 'Physician Assistant'
elif x.str.contains('Family Medicine'):
return 'Family Medicine'
elif x.str.contains('Anesthes'):
return 'Anesthesiology'
else:
return 'Other'
df['desc_clean'] = df['desc'].apply(specialty)
但是我得到一个错误TypeError: 'function' object is not subscriptable
值太多,无法使用手动映射,因此我想使用str.contains。有没有更好的办法
编辑:示例DF
{'person_id': {39063: 33081476009,
50538: 33033519093,
56075: 33170508793,
36593: 33061707789,
51656: 33047685345,
95512: 33022026049,
40286: 33038034707,
3887: 33076466195,
40161: 33052807819,
52905: 33190526939,
35418: 33008425164,
35934: 33015737122,
3389: 33055125864,
136: 33139641318,
105460: 33113871389,
52568: 33075745388,
24725: 33052090907,
34838: 33205449839,
31908: 33183672635,
36115: 33006692696},
'final_desc': {39063: 'None',
50538: 'Urology',
56075: 'Anesthesiology',
36593: 'None',
51656: 'Urology',
95512: 'None',
40286: 'Anesthesiology',
3887: 'Specialist',
40161: 'None',
52905: 'Anesthesiology',
35418: 'Urology',
35934: 'None',
3389: 'Ophthalmology',
136: 'Rheumatology',
105460: 'None',
52568: 'Urology',
24725: 'Family Medicine',
34838: 'None',
31908: 'Nurse Practitioner',
36115: 'None'}}
专业函数接收的x是字符串本身。所以没有x.str,因为它是字符串,所以您可以使用“in”进行检查,如下所示。修改了一些数据以查看结果 提示:您应该使用字典或列表,而不是使用elif链
代码:
输出:
为此,我们可以定义匹配项之间的映射,然后遍历它们并设置列的值,跟踪已更改的列。最后,我们从未匹配的任何列都被设置为
'Other'
您可以使用像
fuzzywuzzy
这样的库进行模糊字符串匹配。这种方法的好处是比某些规则集更灵活,如下所示此解决方案生成子字符串和候选类别的最大分数,返回最匹配的一个。如果低于阈值,则返回默认值(“无”):
结果:
相关问题 更多 >
编程相关推荐