创建新的pandas dataframe列,其中包含搜索子字符串的布尔输出

时间:2019-10-16 21:18:11

标签: python pandas dataframe

我想创建一个新列,如果在现有列中找到子字符串,它将返回True,反之亦然。

因此,在此示例中,我想在a列中搜索子字符串“ abc”,并创建一个布尔列b(无论a列是否包含字符串)。

a      b
zabc   True
wxyz   False
abcy   True
defg   False

我尝试过类似的事情

df['b'] = df['a'].map(lambda x: True if 'abc' in x else False)

但这给了我一个错误,提示“类型'NoneType'的参数不可迭代”

我也尝试过

df['b'] = False
df['b'][df['a'].str.contains('abc')] = True

但是我收到错误消息“无法使用包含NA / NaN值的向量进行索引”

有人可以解释这些错误以及我该怎么做。我已经确认['a']存在并且包含值。但是有些行包含None值。

3 个答案:

答案 0 :(得分:2)

这是怎么做的。

df["b"] = df["a"].str.contains("abc")

关于您的错误。

似乎您的a列中有np.nan值,然后str.contain方法将为这些值返回np.nan,当您尝试使用包含np.nan值的数组进行索引时,pandas告诉您不可能。

答案 1 :(得分:1)

这不是最佳解决方案,但是您可以使用pd.isnull()检查空值,或使用str()将空值转换为字符串。

df = pd.DataFrame({'a':['zabc', None, 'abcy', 'defg']})


df['a'].map(lambda x: True if 'abc' in str(x) else False)

df['a'].map(lambda x: False if pd.isnull(x) or 'abc' not in x else True)

重用:

    0     True
    1    False
    2     True
    3    False
    Name: a, dtype: bool

答案 2 :(得分:0)

您的第一个代码还可以,这是我的示例输出。

s = pd.Series(['cat','hat','dog','fog','pet'])
d = pd.DataFrame(s, columns=['test'])
d['b'] = d['test'].map(lambda x: True if 'og' in x else False)
d

enter image description here