Сравнение (под) строк двух столбцов в DF

У меня есть DF, как показано ниже:

DF =
id  token      argument1             argument2 
1   Tza        Tuvia Tza             Moscow  
2   perugia    umbria                perugia    
3   associated the associated press  Nelson

Теперь я хочу сравнить значения столбцов argumentX и token и соответственно выбрать значение для нового столбца ARG.

DF =
id  token      argument1             argument2    ARG
1   Tza        Tuvia Tza             Moscow       ARG1
2   perugia    umbria                perugia      ARG2
3   associated the associated press  Nelson       ARG1

Вот что я пробовал:

conditions = [
(DF["token"] == (DF["Argument1"])),
 DF["token"] == (DF["Argument2"])]

choices = ["ARG1", "ARG2"]

DF["ARG"] = np.select(conditions, choices, default=nan)

Это сравнивает только всю строку и соответствует, если они идентичны. Такие конструкции, как .isin, .contains или использование вспомогательного столбца, такого как DF["ARG_cat"] = DF.apply(lambda row: row['token'] in row['argument2'],axis=1), не работали. Любые идеи?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 300
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте str.contains с регулярным выражением - join все значения в token по | для регулярного выражения OR для проверки подстрок с границей слова:

pat = '|'.join(r"\b{}\b".format(re.escape(x)) for x in DF["token"])
conditions = [ DF["argument1"].str.contains(pat), DF["argument2"].str.contains(pat)]

choices = ["ARG1", "ARG2"]

DF["ARG"] = np.select(conditions, choices, default=np.nan)
print (DF)
   id       token            argument1 argument2   ARG
0   1         Tza            Tuvia Tza    Moscow  ARG1
1   2     perugia               umbria   perugia  ARG2
2   3  associated  the associated ress    Nelson  ARG1

Обновлено:

Если хотите сравнить каждую строку:

d = {'id': [1, 2, 3], 
     'token': ["Tza","perugia","israel"], 
     "argument1": ["Tuvia Tza","umbria","Tuvia Tza"], 
     "argument2": ["israel","perugia","israel"]} 
DF = pd.DataFrame(data=d) 
print (DF)
   id    token  argument1 argument2
0   1      Tza  Tuvia Tza    israel
1   2  perugia     umbria   perugia
2   3   israel  Tuvia Tza    israel

conditions = [[x[0] in x[1] for x in zip(DF['token'], DF['argument1'])], 
              [x[0] in x[1] for x in zip(DF['token'], DF['argument2'])]]

choices = ["ARG1", "ARG2"]

DF["ARG"] = np.select(conditions, choices, default=np.nan)
print (DF)
   id    token  argument1 argument2   ARG
0   1      Tza  Tuvia Tza    israel  ARG1
1   2  perugia     umbria   perugia  ARG2
2   3   israel  Tuvia Tza    israel  ARG2

Это может сработать, но мне нужно экранировать некоторые символы, потому что я получаю действительно раздражающую ошибку регулярного выражения Python "sre_constants.error: нечего повторять", как показано здесь stackoverflow.com/questions/3675144/…

Mi. 14.08.2018 10:16

Я еще не мог проверить это, но просто подумав о логике регулярного выражения, не всегда ли это возвращает "ARG1"?

Mi. 14.08.2018 10:52

@ThelMi - Как ты думаешь, почему? Для второго подходит perugia, поэтому ARG2

jezrael 14.08.2018 10:53

Да, в этом случае, но представьте себе DF, например: d = {'id': [1, 2, 3], 'token': ["Tza", "perugia", "israel"], "argument1": ["Tuvia Tza "," umbria "," Tuvia Tza "]," argument2 ": [" israel "," perugia "," israel "]} DF = pd.DataFrame (data = d)

Mi. 14.08.2018 10:59

@ThelMi - Не уверен, вы ожидали ARG1 3 раза?

jezrael 14.08.2018 11:06

Ожидается: ARG1, ARG2, ARG2. Получено: ARG1, ARG2, ARG1

Mi. 14.08.2018 11:15

@ThelMi - я вижу, дай мне секундочку.

jezrael 14.08.2018 11:16

Получить логический индекс

argument_cols = ['argument1', 'argument2']
boolean_idx = DF[argument_cols].apply(
    lambda arg_column: DF['token'].combine(arg_column, lambda token, arg: token in arg)
)

boolean_idx
Out:
id  argument1   argument2
0   True    False
1   False   True
2   True    False

Выберите значения из строк:

selected_vals = DF[argument_cols][boolean_idx]

selected_vals
Out: 
id            argument1  argument2
0             Tuvia Tza        NaN
1                   NaN    perugia
2  the associated press        NaN

Сложите selected_val в стек и получите уровень индекса, который содержит имена аргументов (этот код завершится ошибкой, если в строке есть более одного столбца, содержащего значение True):

argument_index_level = selected_vals.stack().index.get_level_values(-1)
# Index(['argument1', 'argument2', 'argument1'], dtype='object')

DF['ARG'] = argument_index_level

DF 
Out: 
id             argument1        argument2        token        ARG
0              Tuvia Tza           Moscow          Tza  argument1
1                 umbria          perugia      perugia  argument2
2   the associated press           Nelson   associated  argument1

Вы можете изменить значения в столбце «ARG» с помощью apply ().

Другие вопросы по теме