【问题标题】:Create new column with matched value between a unique set of item and a long list在一组唯一的项目和一个长列表之间创建具有匹配值的新列
【发布时间】:2018-09-07 09:10:39
【问题描述】:

我不熟悉 python 中的数据处理。 我在数据框中有一列,其文本如下:

  • 我真的很喜欢产品A!
  • 我认为产品 B 适合我!
  • 我会选择产品 C。

我的目标是创建一个带有产品名称的新列(包括“产品”一词)。我不想使用正则表达式。产品名称连续唯一。所以不会有像

这样的字符串的行
  • 我非常喜欢产品 A 和产品 B

一般形式的问题:我有一个独特项目的列表。让我们称之为列表 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

【问题讨论】:

  • 您能否发布一个关于您的数据的小示例以及您期望的结果?这会比你上面的描述更清楚,更不容易被误解。

标签: python list dataframe data-manipulation


【解决方案1】:

短背景

从根本上说,在某些时候,每个列表的每个元素都需要与您编写它的方式类似地进行比较(尽管一旦找到匹配项,您可以跳到下一个循环)。但是编写好的 Python 代码的诀窍是利用在较低级别上编写的功能来提高效率,而不是尝试自己编写。例如:你应该尽量避免使用

for i in range(len(myList)): #code which accesses myList[i]

什么时候可以使用

for myListElement in myList: #code which uses myListElement 

由于在后者中,myList的访问是在内部处理的,比python手动计算i,然后访问myList的第ith元素效率更高。其他一些高级编程语言也是如此。

实际答案

无论如何,为了回答你的问题,我想出了以下方法,我相信它会更有效:

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 使用率。您可以通过将答案转换为列表(list(answer))来强制计算它,但这不是必需的。

我希望我正确理解了您的问题。如果您有任何问题,请告诉我:)

【讨论】:

  • 谢谢。您的解决方案也有效。详细查看您的代码后,我会回复您。
猜你喜欢
  • 2021-11-21
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多