首页 > 解决方案 > Pandas 中的 lambda if/else 语法错误

问题描述

我有一个数据框,其中包含一个名为“body”的列,由各种长度的字符串组成。我还有一个缩写词字典,看起来像这样:

dict acronyms = {
    'brb': 'be right back'
}

我试图通过查看dict的任何键值是否在字符串中,然后用该键的值替换它来用它们的实际含义替换数据框中的首字母缩写词。

df.body = df.body.apply(lambda x: ' '.join([word for word in x.split() if word not in acronyms.keys() else replace_acronym(word)]))

但是,我得到指向代码其他部分的语法错误。我不明白这段代码到底有什么问题,有人可以解释一下吗?

replace_acronym(word)函数的代码是:

def replace_acronym(acrn):
    return acronyms.get(acrn)

标签: pythonpandaslambda

解决方案


列表理解的工作方式如下:

[<put this in the list> for ... if <this condition is true>]

if条件为假时,该元素将从结果列表中省略。没有else。你的意思是:

[<a> if <cond> else <b> for ...]

您想将..if..else..表达式放入<put this in the list>理解的部分。所以:

[word if word not in acronyms.keys() else replace_acronym(word) for word in x.split()]

当然,这可以简化很多:

  • word in acronyms就足够了,已经检查了密钥的存在
  • replace_acronym(word) if word in acronyms else word比否定条件更容易
  • 因为replace_acronym真的没有做很多,只是做acronyms[word] if word in acronyms else word
  • 当然,整个模式已经封装在 中dict.get,所以:acronyms.get(word, word)
  • []如果您直接将其通过管道输入,则这是多余的' '.join,只需使用生成器表达式即可:
' '.join(acronyms.get(word, word) for word in x.split())

推荐阅读