我有三个列表,(1)治疗(2)药物名称和(3)药物代码符号。我正在尝试为14,700种治疗中的每一种识别各自的医药代码符号。我目前的方法是识别(2)中是否有任何名称是" in“(1),然后返回相应的(3)。然而,我得到了一个与14,700种治疗相对应的药品代码符号的随机列表(正确长度)。我所写的方法代码如下:
codes = pandas.read_csv('Codes.csv', dtype=str)
codes_list = _codes.values.tolist()
names = pandas.read_csv('Names.csv', dtype=str)
names_list = names.values.tolist()
treatments = pandas.read_csv('Treatments.csv', dtype=str)
treatments_list = treatments.values.tolist()
matched_codes_list = range(len(treatments_list))
for i in range(len(treatments_list)):
for j in range(len(names_list)):
if names_list[j] in treatments_list[i]:
matched_codes_list[i]=codes_list_text[j]
print matched_codes_list
如果你对我的错误之处有任何建议,将不胜感激!
发布于 2016-01-21 06:53:20
我不知道你在期待什么。您应该将xxx_list代码替换为示例,因为您在读取csv时似乎没有任何问题。
假设你这样做了,你的结果是这样的。
codes_list = ['shark', 'panda', 'horse']
names_list = ['fin', 'paw', 'hoof']
assert len(codes_list) == len(names_list)
treatments_list = ['tape up fin', 'reverse paw', 'stand on one hoof', 'pawn affinity maneuver', 'alert wing patrol']
这听起来像是你在尝试确定每个“治疗”的“代码”,假设代码和名称的数量是相同的(并表示一些映射)。您计划使用名称的存在来确定代码。
我们可以将名称和代码列表压缩在一起,以避免在那里使用索引,并且我们可以在处理列表上使用迭代,而不是使用索引,以提高pythonic的可读性
matched_codes_list = []
for treatment in treatment:
matched_codes = []
for name, code in zip(names_list, codes_list):
if name in treatment:
matched_codes.append(code)
matched_codes_list.append(matched_codes)
这会给出类似这样的结果
assert matched_codes_list == [
['shark'], # 'tape up fin'
['panda'], # 'reverse paw'
['horse'], # 'stand on one hoof'
['shark', 'panda', 'horse'], # 'pawn affinity maneuver'
[], # 'alert wing patrol'
]
请注意,用于执行此操作的方法相当慢(并且可能会给出误报,请参阅第四个条目)。您将为每个名称/代码对遍历一次所有治疗描述的文本。
你可以使用像'lookup = {name: code for name,code in zip(names_list,codes_list)},或者itertools.izip这样的字典来获得更小的好处,否则可能需要更聪明的方法,比如将处理方法分成一个包含单词的集合,或者将单词映射到多个代码中。
https://stackoverflow.com/questions/34911418
复制相似问题