将str.contains()应用于熊猫数据框

时间:2019-09-24 23:45:55

标签: python string pandas jupyter

我是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()

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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


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