У меня есть один столбец фрейма данных 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)
Нет. Я просто хочу проверить, доступно ли значение words_5 в словах_7, тогда оно не должно добавляться.






Проблема в вашем коде в том, что 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
Спасибо, это работает. Не могли бы вы рассказать. где проблема в моем подходе?
@JawedSheikh, пожалуйста, посмотрите мое редактирование
@JawedSheikh не беспокойтесь; я рад, что смог помочь
Вас волнует порядок слов в результате?