以下是字典的一个子集:
equiv= {'Urin problem': 'C0/ Urine', 'disorientation': 'C0233407 / Disorientation', 'fatigue': 'C0015672 / Fatigue', 'headache': 'C334 / headache'}
我要把以下数据映射到这本词典中:
^{pr2}$输出应如下所示:
drug_id WD Map Exact_Match
lexapro.1 minor urin problem C0/ Urine
lexapro.1 Fatigue 'C0015672 / Fatigue 1
lexapro.1 disorientation C0233407 / Disorientation 1
lexapro.1 tiredness
lexapro.14 dizziness
lexapro.14 headaches C334 / headache
正如你看到的,如果它能找到精确的地图,精确匹配的一栏将填充1,就像疲劳和迷失方向一样。如果项目是部分映射,则映射列将具有相应的值,但精确匹配列没有得到任何值。这是我的代码:
df['Map'] = df["WD"].str.extract('('+'|'.join(list(equiv))+')').map(equiv).fillna(1),
但是它有以下错误:AttributeError: 'DataFrame' object has no attribute 'map'
。但是当我使用这个代码:df['Map'] = df["WD"].map(equiv).fillna(1)
时,没有错误。但是,它对部分匹配没有帮助。I also do not know how to fill in the Exact_Match column with 1 when there is exact match.
这有点类似于MaxU的方法(基于
replace()
),对于这个小例子,速度差不多,比johnchase慢但您可能希望在更大、更真实的数据帧上进行测试。我只是把它扩展到1500行,这是最快的方法(其次是MaxU,然后是johnchase),但这可能不一定能保存您的实际数据。在
第三行(
df.loc
)感觉有点多余或有点老套,但我无法找到一种方法使replace
为不匹配项返回NaN或类似的值,所以我只是将“Map”转换为''
,如果“WD”==“Map”。不应该拖得太慢,但似乎有更好的方法。。。在可以使用以下矢量化方法来执行此操作:
演示:
^{pr2}$我可能会用几个不同的步骤来做这件事,因为我认为这里确实有相当多的事情要做。对于匹配字符串,您可能需要尝试类似python的difflib
第一行是将值设置为1,如果确切的字符串在字典键中,否则返回null。第二行使用difflib获取与键最接近的字符串匹配。您可以查看文档中有关设置返回的相似性阈值的信息。然后,从前面生成的第三行字典返回相似的值。可能有一个更简单的方法来实现这一点,但这是我将如何解决这个问题
在
相关问题 更多 >
编程相关推荐