pandas 忽略带有字符串contains的NaN

lvmkulzt  于 2022-12-21  发布在  其他
关注(0)|答案(6)|浏览(201)

我想查找包含字符串的行,如下所示:

DF[DF.col.str.contains("foo")]

但是,这会失败,因为某些元素是NaN:
ValueError:无法使用包含NA / NaN值的向量进行索引
所以我求助于模糊的

DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]

有更好的办法吗?

biswetbf

biswetbf1#

df[df.col.str.contains("foo").fillna(False)]
ecbunoof

ecbunoof2#

我不是100%知道为什么(实际上是来这里寻找答案的),但这也是可行的,而且不需要替换所有的nan值。

import pandas as pd
import numpy as np

df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

newdf = df.loc[df['a'].str.contains('foo') == True]

使用或不使用.loc均可。
我不知道为什么会这样,因为我知道当你用括号panda来索引时,括号内的任何东西都被求值为TrueFalse,我不知道为什么把括号内的短语写成“额外的布尔值”会有任何效果。

gcuhipw9

gcuhipw93#

您也可以使用query方法通过布尔表达式查询DataFrame的列,如下所示:

df.query('a.str.contains("foo", na=False)')

请注意,您可能不会获得性能改进,但它更具可读性(可以论证)。

sg24os4d

sg24os4d4#

您还可以设置以下模式:

DF[DF.col.str.contains(pat = '(foo)', regex = True) ]
qyyhg6bp

qyyhg6bp5#

有一个标志:

In [11]: df = pd.DataFrame([["foo1"], ["foo2"], ["bar"], [np.nan]], columns=['a'])

In [12]: df.a.str.contains("foo")
Out[12]:
0     True
1     True
2    False
3      NaN
Name: a, dtype: object

In [13]: df.a.str.contains("foo", na=False)
Out[13]:
0     True
1     True
2    False
3    False
Name: a, dtype: bool

请参阅str.replace文档:
na:默认值NaN,为缺失值填充值。
因此,您可以执行以下操作:

In [21]: df.loc[df.a.str.contains("foo", na=False)]
Out[21]:
      a
0  foo1
1  foo2
9rnv2umw

9rnv2umw6#

除了以上的答案外,我想说的是,对于没有单个单词名称的栏目,您可以使用:

df[df['Product ID'].str.contains("foo") == True]

希望这个有用。

相关问题