Не могу понять, где я делаю ошибку

У меня есть один столбец фрейма данных dtc_mined, который содержит значение, как показано ниже, разделенное |

P18A253|P18A0|P18A2|P18A043|P2B61

здесь он содержит некоторые значения, часть его длины равна 5 (P18A2) или часть его длины равна 7 (P18A043), теперь я хочу проверить, доступно ли значение слова длины 5 в значении слов длины 7 то слово длиной 5 должно быть удалено

Ниже мой ожидаемый результат

P18A253|P18A043|P2B61

Ниже мой код, который я пробовал

import pandas as pd

# Sample DataFrame
data = {'dtc_mined': ['P18A253|P18A0|P18A2|P18A043|P2B61']}
df = pd.DataFrame(data)

# Split the values and create sets of 5 and 7 character words
df['split_values'] = df['dtc_mined'].str.split('|')
df['words_5'] = df['split_values'].apply(lambda lst: set(word for word in lst if len(word) == 5))
df['words_7'] = df['split_values'].apply(lambda lst: set(word for word in lst if len(word) == 7))

# Remove 5-character words that have a corresponding 7-character word
df['filtered_values'] = df.apply(lambda row: '|'.join(word for word in row['split_values'] if len(word) == 7 or word not in row['words_7']), axis=1)

# Drop intermediate columns and display the result
result = df.drop(['split_values', 'words_5', 'words_7'], axis=1)
print(result)

Я также попробовал другой подход

# Remove 5-character words that have a corresponding 7-character word

def Check1(row):
    for word in row['words_5']:
        if word not in row['words_7']:
            row['words_7'].add(word)
    return row['words_7']

df['filtered_values'] = df.apply(Check1, axis=1)

Вас волнует порядок слов в результате?

Nick 18.08.2023 08:26

Нет. Я просто хочу проверить, доступно ли значение words_5 в словах_7, тогда оно не должно добавляться.

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

Ответы 1

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

Проблема в вашем коде в том, что word not in row['words_7'] пропускает все 5-буквенные слова. Что вам нужно проверить, так это то, что ни одно из слов в row['words_7'] не начинается с 5-буквенного слова, т.е.

df['filtered_values'] = df.apply(lambda row: '|'.join(word for word in row['split_values'] if len(word) == 7 or not any(w2.startswith(word) for w2 in row['words_7'])), axis=1)

Это, вероятно, проще всего сделать, сделав все в функции и применив это к значениям:

def filter_words(ll):
    words = ll.split('|')
    w7 = set(w for w in words if len(w) == 7)
    return '|'.join(w for w in words if w in w7 or not any(w2.startswith(w) for w2 in w7))

Эта функция формирует набор слов из 7 букв, а затем фильтрует список слов в зависимости от того, находится ли слово в этом наборе или ни одно из слов в наборе не начинается с одинаковых букв.

Чтобы использовать, просто примените:

df['filtered_values'] = df['dtc_mined'].apply(filter_words)

Вывод (для ваших образцов данных):

                           dtc_mined        filtered_values
0  P18A253|P18A0|P18A2|P18A043|P2B61  P18A253|P18A043|P2B61

Спасибо, это работает. Не могли бы вы рассказать. где проблема в моем подходе?

Jawed Sheikh 18.08.2023 08:45

@JawedSheikh, пожалуйста, посмотрите мое редактирование

Nick 18.08.2023 09:00

@JawedSheikh не беспокойтесь; я рад, что смог помочь

Nick 18.08.2023 09:52

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

Использование шаблона регулярного выражения для извлечения предложения с ключевым словом
Как использовать переименование Perl в терминале macOS для замены случайных имен файлов пользовательской строкой и индексом?
Как извлечь текст с помощью регулярного выражения для различных типов текста
Проблемы с попыткой создать регулярное выражение для получения ссылок на законодательство
Регулярное выражение без цифр или без пробелов до и после цифры
Регулярное выражение для соответствия последнему вхождению символа, если за ним следуют буквенно-цифровые символы, в противном случае - соответствие всему
Извлечь все числа в строке, которые не заканчиваются десятичным знаком или скобками в R
Принудительно находить жала только с цифрами внутри и опускать другие
Извлечь все числа в строке, которым не предшествует определенное слово в R
Извлечь все числа в строке, которым не предшествует определенное слово в R