带有for循环和ifelse语句的Lambda函数

2024-09-29 01:25:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧df,看起来像这样

index       Posts                    clean_text
  0     Hi I am fine.              [Hi, I, am, fine]
  1     You are a piece of shit.   [You, are, a, piece, of, shit]
.
.
.

我有一个名为corpus的列表,其中有3000个脏话

我想遍历clean_text列,通过检查所有行的条件,将一个新行result添加到df。条件是: 如果clean_text列的任何一行中的任何一个单词出现在corpus中,则result列将具有字符串Irrelevant,否则Relevant

示例:如果列表[Hi, I, am, fine]中的任何单词出现在corpus中,则列result将有Irrelevant,否则relevant。由于此列表没有任何脏话,因此输出应为relevant

所需输出为:

index       Posts                    clean_text                       result
  0     Hi I am fine.              [Hi, I, am, fine]                  Relevant
  1     You are a piece of shit.   [You, are, a, piece, of, shit]     Irrelevant
.
.
.

我想用lambda函数来做这个。到目前为止,我已经这样做了-

df['result'] = df['clean_text'].map(lambda x: ["Relevant" for w in x if w not in corpus]) 首先,我无法在这里编写else部分,其次,它显示了如下所示的不良输出

index       Posts                    clean_text                       result
  0     Hi I am fine.              [Hi, I, am, fine]                  [Relevant, Relevant, Relevant, Relevant]
  1     You are a piece of shit.   [You, are, a, piece, of, shit]     [Relevant, Relevant, Relevant,...]
.
.
.

我也尝试过像这样编写一个“for”循环,但这需要很多时间:

for i in range(df.shape[0]):
    for word in df.loc[i]['clean_text']:
      if word in corpus:
        df['result'] = "Irrelevant"
        #break
      else:
        #continue
        df['result'] = "Relevant"

请帮助我使用lambda函数获得所需的输出


Tags: oftextincleanyoudfpiececorpus
1条回答
网友
1楼 · 发布于 2024-09-29 01:25:10

使用corpus = set(corpus)

然后你可以用

df['clean_text'].map(lambda l: "Relevant" if any(x in corpus for x in l) else "Irrelevant")

请注意,您使用的是lambda实际上并不相关。你本可以这样做:

def search_corpus(tokens):
    if any(token in corpus for token in tokens):
        return "Relevant"
    return "Irrelevant" 

并且做:

df['clean_text'].map(search_corpus)

这不会影响性能lambda表达式不会创建任何特殊的内容,而且您永远不必使用它

相关问题 更多 >