【发布时间】:2018-03-14 14:09:08
【问题描述】:
我有一个数据框,其中每一行对应一个字符串。我想从这些字符串中删除某些单词 - 这是我使用 lambda 函数的方法:
def remove_words(s):
return s.apply(lambda x: [x for x in x if x not in ["name", "is", "m"]])
s = pd.DataFrame({"s":["Hi my name is Joe", "Hi my name is Hannah", "Hi my name is Brian"]})
remove_words(s.s)
这不会产生正确的结果,因为它会从所有单词中删除m:
0 [H, i, , y, , n, a, e, , i, s, , J, o, e]
1 [H, i, , y, , n, a, e, , i, s, , H, a, n, ...
2 [H, i, , y, , n, a, e, , i, s, , B, r, i, ...
Name: s, dtype: object
然而,我想要的结果是,
0 ["Hi my Joe"]
1 ["Hi my Hannah"]
2 ["Hi my Brian"]
Name: s, dtype: object
- 所以它应该只删除一个
m,如果它是字符串中的一个单独的字母。是否可以使用 lambdas 做到这一点?
使用正则表达式时请看这个反例:
regex = '|'.join((' %s ' % word for word in ["in", "out", "between"]))
test = pd.DataFrame({"s": ["hello in out between inner in"]})
test.s.str.replace(regex, " ")
这不会清除所有 out 或 in
0 hello out inner in
Name: s, dtype: object
【问题讨论】:
-
lambda x: [x for x in x if x not in...你知道你可以使用任何你想要的变量名,对吧?将 lambda 参数和迭代变量都命名为x是一种混淆读者的好方法。