【问题标题】:Usage of str.contains() applied to pandas data frame将 str.contains() 的用法应用于 pandas 数据框
【发布时间】:2019-09-24 23:45:55
【问题描述】:

我是 Python 和 Jupyter Notebook 的新手,目前正在学习本教程:https://www.dataquest.io/blog/jupyter-notebook-tutorial/。到目前为止,我已经导入了 pandas 库和其他一些东西,并且我制作了一个数据框“df”,它只是一个包含公司利润和收入数据的 CSV 文件。我无法理解教程的以下行:

non_numberic_profits = df.profit.str.contains('[^0-9.-]')

我理解本教程的重点:识别所有利润变量包含字符串而不是数字的公司。但我不明白 [^0-9.-] 的意义以及上述函数的实际工作原理。

我的完整代码如下。谢谢。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")

df = pd.read_csv('fortune500.csv')
df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
non_numberic_profits = df.profit.str.contains('[^0-9.-]')
df.loc[non_numberic_profits].head()

【问题讨论】:

标签: python string pandas jupyter


【解决方案1】:

表达式[^0-9.-]是所谓的正则表达式,它是用于描述搜索模式的特殊文本字符串。使用正则表达式(或简称 'RegEx'),您可以提取字符串的特定部分。例如,您可以从字符串123foo456 中提取foo

在 RegEx 中,当使用 [] 时,您定义了必须匹配的字符范围。例如,[bac] 匹配字符串 abcdefg 中的 abc[bac] 也可以改写为[a-c]

使用[^] 可以否定字符范围。因此,应用于上述示例的 RegEx [^a-c] 将匹配 defg

现在有一个问题:
由于^- 在正则表达式中使用时具有特殊含义,因此必须将它们放在[] 中的特定位置才能进行字面匹配。具体来说,如果您想从字面上匹配-,并且想将其排除在字符范围之外,则必须将其放在[]最右端,例如[abc-]

把它们放在一起
RegEx '[^0-9.-]' 表示:'匹配所有包含数字 0 到 9、点 (.) 或破折号 (-) 的子字符串。您可以看到您的正则表达式应用于一些示例字符串here

pandas 函数 df.profit.str.contains('[^0-9.-]') 检查 DataFrame 的 profit 列中的字符串是否匹配此 RegEx,如果匹配则返回 True,如果不匹配则返回 False。结果是一个 pandas Series 包含生成的 True/False 值。


如果您遇到困难,Pandas docs 是您的朋友。 Stack Overflow 的 What Does this Regex Mean?Regex 101 也是不错的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多