【问题标题】:Why does df['text'].str.contains('.') always return True? [duplicate]为什么 df['text'].str.contains('.') 总是返回 True? [复制]
【发布时间】:2019-06-12 17:54:25
【问题描述】:

我正在编写一些 python 代码来替换 pandas DataFrame 中的一列字符串中的标点符号。替换后,我注意到测试存在“。”在结果字符串中总是返回 True。

我正在使用 Python 3.7,并在使用 PyCharm 时发现了这个细节。但是,我能够在 Jupyter Notebooks 中重现结果。


df = pd.DataFrame(['My string.'], columns=['Text'])
df['Text'] = df['Text'].str.replace('[^\w\s]', '')
print(df['Text'].str.contains('.'))

>>> 0  True

我希望 False 作为字符 '.'被替换为空字符串。字符串本身看起来已经删除了标点符号,但有趣的是,存在测试仍然返回 True。对其他标点符号重复此操作会返回预期值 False。谁能解释这是否是预期的行为?

提前致谢!

【问题讨论】:

  • string.replace 将找到确切的字符串[^\w\s] 并替换它,它不存在于数据框中,而且'[^\w\s]' 看起来像正则表达式,你在尝试re.sub 吗?
  • . 是一个正则表达式类,意思是“字面上的任何字符”,使用 '\.' - 正则表达式转义字符

标签: python pandas


【解决方案1】:
print(df['Text'].str.contains('.',regex=False))
>>> 0  False

'.'是正则表达式中除换行符之外的任何字符,如果你想使用正则表达式,你需要告诉熊猫

【讨论】:

  • 好答案,您可能想添加一个简短的解释,也许指向in 运算符
【解决方案2】:

感谢 Chris A 和 sygneto 指出这一点 - 在此处查看 pandas 文档后:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html,可以确认 contains() 的第一个参数是正则表达式模式。将正则表达式设置为 False 会将模式视为原始字符串,而不是通配符,从而解决问题。

【讨论】:

  • 如果我的回答足够好请采纳
猜你喜欢
  • 1970-01-01
  • 2020-01-29
  • 2012-04-03
  • 2021-09-11
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多