有时候需要删除数据表中某一列中包含指定字符串的行,可以使用pandas的字符串包含函数.str.contains:

pd.Series.str.contains(pat, case=True, flags=0, na=None, regex=True)
#pat是搜索字符,case表示是否区分大小写,flags表示是否传递给 re 模块的标志,regex=True则pat是一个正则表达式,regex=False表示pat是一个字符串

官网详细解释链接:https://pandas.pydata.org/docs/reference/api/pandas.Series.str.contains.html?highlight=contains#pandas.Series.str.contains

示例:提取pandas dataframe中’商品名称‘列包含’手机’字符的所有数据:

#提取含有指定字符的行
df2=df[df['商品名称'].str.contains(pat='手机',regex=False)]  #regex=True则pat是一个正则表达式,regex=False表示pat是一个字符串

删除pandas dataframe中’商品名称’列包含’手机’字符的所有数据:

#删除含有指定字符的行
df2=df.drop(df[df['商品名称'].str.contains(pat='手机',regex=False)].index,inplace=True)  #regex=True则pat是一个正则表达式,regex=False表示pat是一个字符串

这个df层层嵌套有点让人眼花缭乱,实际过程是先通过df[‘商品名称’].str.contains(pat=‘手机’,regex=False)] 找到‘商品名称’列中所有包括‘手机’的行,然后通过.index得到df行索引,再通过.drop函数删除df中包括这些索引的行。

另外一种情况是在运行中遇到上面方法报错:

ValueError: cannot index with vector containing NA / NaN values

研究了好久,又是上官网,又是找CSDN其他人的资料,发现都是上面的写法,最后发现问题出在没有加一个条件判断,在是否包含字符条件语句里加上==True,程序就运行正常了,改进后的代码如下:

#删除含有指定字符的行,注意在’regex=False)’后面加了‘==True’,也就是只有包含这个字符的行才返回行索引给drop函数。
df2=df.drop(df[df['商品名称'].str.contains(pat='手机',regex=False)==True].index,inplace=True)  #regex=True则pat是一个正则表达式,regex=False表示pat是一个字符串
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐