我是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()
答案 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也是不错的起点。