Создать новый столбец данных pandas, содержащий логические выходные данные поиска подстрок - PullRequest
0 голосов
/ 17 октября 2019

Я хотел бы создать новый столбец, в котором, если в существующем столбце найдена подстрока, она вернет True и наоборот.

Так что в этом примере я хотел бы найти подстроку «abc» в столбце a и создать логический столбец 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 ]

2 голосов
/ 17 октября 2019

Вот как это сделать.

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

Относительно вашей ошибки.

Кажется, у вас есть значение np.nan в вашем столбце a, тогда метод str.contain вернетnp.nan для этих значений, поскольку вы пытаетесь индексировать массив, содержащий значение np.nan, панды сообщают вам, что это невозможно.

1 голос
/ 17 октября 2019

Не лучшее решение, но вы можете проверить нулевые значения с помощью 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)

Reuslt:

    0     True
    1    False
    2     True
    3    False
    Name: a, dtype: bool
0 голосов
/ 17 октября 2019

Ваш первый код в порядке, вот вывод для моего образца.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...