Python Панды / Numpy Строка Содержит, но не Содержит - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь добавить новый столбец в фрейм данных со словом «foo», если он найден в «column1», но не хочу его добавлять и оставляю значение пустым, если, скажем, слово «bar» найдено. Я пытался добавить & к заявлению ниже, но оно не работает.

import pandas as pd
import numpy as np

df = pd.read_csv('newdoc.csv')

df['new_column'] = np.where(df['column1'].str.contains("foo", case=False, na=False), 'Foo', '')

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Вы пытались написать сервисную функцию и затем использовать apply()?

def check_str(mystr):
    try:
        if 'foo' in mystr and 'bar' not in mystr:
            return 'match'
        else:
            return 'no match'
    except:
        return 'no match'

df['new_column'] = df['column_1'].apply(check_str)
0 голосов
/ 08 февраля 2020

Это просто вопрос правильного выражения:

df["col1"]=df["x"].str.contains(r"^((?<!bar).)*foo(.(?!bar))*$", regex=True)

Для фиктивных данных:

import pandas as pd

df=pd.DataFrame({"x": ["foo", "asdghbat", "cjjfoo hjgbar5", "fooba", "bar jjkdfhb foojgf"], "y": [2,7,4,6,3]})

df["col1"]=df["x"].str.contains(r"^((?<!bar).)*foo(.(?!bar))*$", regex=True)

>> df

                    x  y   col1
0                 foo  2   True
1            asdghbat  7  False
2      cjjfoo hjgbar5  4  False
3               fooba  6   True
4  bar jjkdfhb foojgf  3  False

Кредиты - адаптированы с: https://social.msdn.microsoft.com/Forums/en-US/19ee0964-06b4-4b00-808a-c5be756e0459/regex-that-includes-quotword-aquot-but-does-not-contain-quotword-bquot

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