Проверьте, находится ли значение столбца в одном конкретном столбце с помощью Pandas

Итак, у меня есть один фрейм данных, который имеет несколько столбцов, и я хочу попытаться выяснить, находятся ли значения в моих столбцах «Связано ..» в столбце с именем «Новые имена», и если это так, то конкретное значение ячейки должно быть установлено таким образом » cell.value - Да »или, если не то,« cell.value - Нет »

import pandas as pd

d = {'New Names': ['a,b,c','a','c,d,e,f','a'], 'Linked Letter 0': 
['a','b','c','d'],
'Linked Letter 1': ['c','s','v','None'],
'Linked Letter 2': ['None','None','d','s']}

df_new = pd.DataFrame(data=d)

df_new


      Index   New Names   Linked Letter 0   Linked Letter 1   Linked Letter 2  
     ------- ----------- ----------------- ----------------- ----------------- 
        0       a,b,c       a                 c                 None             
        1       a           b                 s                 None             
        2       c,d,e,f     c                 v                 d                
        3       a           d                 None              s      

Итак, ожидаемый результат должен быть в следующей таблице;

    Index   New Names   Linked Letter 0   Linked Letter 1   Linked Letter 2  
    ------- ----------- ----------------- ----------------- ----------------- 
    0        a,b,c         a - YES           c - YES           None             
    1        a             b - NO            s - NO            None             
    2        c,d,e,f       c - YES           v - NO            d - YES          
    3        a             d - NO            None              s - NO    

Одна проблема с решением, приведенным ниже:

Проблема в том, что сопоставление значений YES и NO значениям иногда не работает должным образом. Например, то же значение, которое получает YES в конце, может получить NO в следующей строке, даже если значение в столбце New Names одинаково в обеих строках.

Как вы думаете, почему это могло произойти?

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
685
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать pd.DataFrame.filter для фильтрации столбцов Linked, понимание списка для построения логического массива и, наконец, loc с np.where для условной логики:

df = pd.DataFrame(data=d)

for col in df.filter(like='Linked'):
    bools = [link in new_names for link, new_names in zip(df[col], df['New Names'])]
    df.loc[df[col] != 'None', col] += pd.Series(np.where(bools, ' - YES', ' - NO'))

print(df)

  Linked Letter 0 Linked Letter 1 Linked Letter 2 New Names
0         a - YES         c - YES            None     a,b,c
1          b - NO          s - NO            None         a
2         c - YES          v - NO         d - YES   c,d,e,f
3          d - NO            None          s - NO         a

хотя он работает так, как должен, однако в некоторых случаях логический массив заполняет неправильный тег (ДА, НЕТ), и это происходит даже с точно такими же значениями. например, в некоторых строках вы найдете один элемент в столбце «Новые имена» и прикрепите значение «Да», а для того же элемента в другой строке он прикрепит «Нет», даже если значение находится в столбце «Новые имена».

iSerd 09.01.2019 14:05

@iSerd, извини, не слежу. Хотите передать отредактируйте свой вопрос данные, которые позволяют нет работать с предложенным мной решением?

jpp 09.01.2019 14:10

Привет @jpp, я только что обновил запись своим вопросом, спасибо за внимание

iSerd 09.01.2019 14:27

@iSerd, извините, я имел в виду изменить ваш ввод, дать минимальный воспроизводимый пример, т.е. ввод, где моя логика работает нет. Он работает с введенными вами данными.

jpp 09.01.2019 14:28

На самом деле, если я попытаюсь воссоздать данные самостоятельно, ваше решение будет работать, однако мне нужно обработать данные, прежде чем получить эту версию, указанную в моем вопросе, и я не могу поделиться фактическими данными (конфиденциальными), поэтому я считаю, что это должно быть чем-то связанным с проблемой типа данных или sth (я уже проверил тип данных, где у меня неправильное сопоставление для Да и Нет) - думаете ли вы о какой-либо другой возможной проблеме здесь? потому что это так странно, что иногда это работает, а иногда нет.

iSerd 09.01.2019 14:43

@iSerd, возможно. Но это другой вопрос. В качестве ответа на ваш новый вопрос я предлагаю вам задать новый вопрос с минимальный воспроизводимый пример. В противном случае я (или кто-либо другой) просто догадываюсь.

jpp 09.01.2019 14:44

Спасибо! Я так и сделаю. Ваше здоровье

iSerd 09.01.2019 14:47

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