我有三个清单,(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
对于我出错的地方的任何建议都将不胜感激!
答案 0 :(得分:0)
我不知道你在期待什么。您应该用示例替换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'
]
请注意,用于执行此操作的方法非常慢(并且可能会出现误报,请参阅第4项)。您将遍历每个名称/代码对的所有处理描述的文本。
你可以使用像'lookup = {name:code for name,code in zip(names_list,codes_list)}或itertools.izip这样的词典来获得微小的收益。否则可能需要更聪明的东西,可能将处理分成包含单词的集合,或将单词映射成多个代码。