我想找到包含字符串的行,就像这样:
DF[DF.col.str.contains("foo")]
然而,这失败了,因为有些元素是NaN:
ValueError:不能索引包含NA / NaN值的向量
所以我诉诸于混淆
DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
有没有更好的办法?
我想找到包含字符串的行,就像这样:
DF[DF.col.str.contains("foo")]
然而,这失败了,因为有些元素是NaN:
ValueError:不能索引包含NA / NaN值的向量
所以我诉诸于混淆
DF[DF.col.notnull()][DF.col.dropna().str.contains("foo")]
有没有更好的办法?
这里有一个标志:
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
除了上面的答案,我想说的是,对于没有单一单词名称的列,你可以使用:-
df[df['Product ID'].str.contains("foo") == True]
希望这能有所帮助。
我不知道为什么(实际上来这里是为了寻找答案),但这也是可行的,并且不需要替换所有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都有效。
我不知道为什么这是可行的,正如我所理解的,当你用括号索引时,熊猫评估括号内的任何东西为真或假。我不知道为什么括号内的短语“额外布尔”有任何影响。
也可以使用query方法查询DataFrame的列,使用布尔表达式,如下所示:
df.query("a.str.contains('foo', na=False)")
或者更有趣的,我认为更容易读懂:
df.query("a.str.contains('foo')==True")
注意,您可能不会得到性能上的改进,但是可读性更强(可以说)。