我是python中数据处理的新手。 我在数据框中有一列,其文字如下:
我的目标是使用“产品名称”(包括单词“ Product”)创建一个新列。我不想使用正则表达式。产品名称连续唯一。因此,不会有带有
这样的字符串的行通用形式的问题:我有一个唯一项列表。让我们将其称为列表A。我还有另一个字符串列表,其中每个字符串都包括列表A中的至少一项。如何创建具有匹配项的新列表。
我写了以下代码。工作正常。但是,即使我(编程新手)也可以看出这是非常低效的。
有更好更好的解决方案吗?
product_type = ['Product A', 'Product B', 'Product C', 'Product D']
product_list = [None] * len(fed_df['product_line'])
for i in range(len(product_list)):
for product in product_type:
if product in fed_df['product_line'][i]:
product_list[i] = product
fed_df['product_line'] = product_list
答案 0 :(得分:0)
从根本上讲,某些时候,每个列表的每个元素都需要类似于您编写它的方式进行比较(尽管一旦找到匹配项,您就可以跳到下一个循环)。但是编写好的python代码的诀窍是利用较低级别的功能来提高效率,而不是尝试自己编写。例如:您应该避免使用
for i in range(len(myList)): #code which accesses myList[i]
何时可以使用
for myListElement in myList: #code which uses myListElement
从后者开始,对myList的访问在内部进行处理,比python手动计算i然后访问myList的第i th 元素更有效。这个事实在其他一些高级编程语言中也是如此。
无论如何,为了回答您的问题,我提出了以下建议,我相信这样会更有效:
answer = map(lambda product_line_element: next(filter(lambda product: product in product_line_element,product_type),None), fed_df['product_line'])
它的作用是映射fed_df ['product_line']的每一行(地图),并用包含在fed_df ['中每一行产品中找到的产品类型的列表中的第一个元素(下一个)替换该元素。 product_line'](过滤器)。
要对此进行测试,我列出了要用作fed_df ['productline']
的列表[['h', 'a', 'g'], ['k', 'b', 'l'], ['u', 't', 'a'], ['r', 'e', 'p'], ['g', 'e', 'b']]
并搜索“ a”和“ b”“ product_types”,从而得出
['a', 'b', 'a', None, 'b']
结果,我想这就是你想要的...
这些映射函数通常比for循环更受青睐,因为它不会引起突变,并且可以更轻松地实现多线程/多进程。
该解决方案的另一个好处是,直到将来的代码尝试访问答案时才计算结果,这样可以更好地分散CPU使用率。您可以通过将答案转换为列表(列表(answer))来强制进行计算,但这不是必需的。
希望我能正确理解您的问题。让我知道您是否有任何问题:)