python - 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)
解决方案
列表理解的工作方式如下:
[<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())
推荐阅读
- flutter - How do dependencies affect the overall size of the app?
- python - 识别语义错误
- html - 将向下箭头放在表格内的输入内
- c++ - 如何进行从 std::string_view 到 std::string 的转换
- elasticsearch - ElasticSearch 查询:无法获得所有聚合结果
- session - 无法使用 axios 或 fetch 发送 httpOnly cookie
- flutter - Flutter ScrollController 没有附加到 scrollView
- django - Django FormField:如何在基类中设置“max_length”和其他属性
- swiftui - 使 SwiftUI 视图消失
- odoo-15 - 如何每页只打印十条记录qweb odoo