Как удалить определенный элемент списка в фрейме данных, который заканчивается определенной строкой в python

#python #dataframe #label #multilabel-classification

#python #фрейм данных #метка #многозначная классификация

Вопрос:

Как удалить определенный элемент списка в фрейме данных, который заканчивается определенной строкой в python? Например, у меня есть эта таблица:

 Text   |  label
=======================
text1  |  green txt,red,blue
text2  |  black,red,blue
text3  |  green txt,blue,black
text4  |  black,red,green
 

Я хочу удалить метку, которая заканчивается строкой «txt», поэтому результат, который я хочу получить, это:

     Text   |  label
    =======================
    text1  |  red,blue
    text2  |  black,red,blue
    text3  |  blue,black
    text4  |  black,red,green
 

Извините, что я отредактировал вопрос.

Ответ №1:

Все значения, которые вы хотите удалить, являются строками. Если ваши списки также содержат другие строки, которые вы хотите сохранить, если они не заканчиваются на ‘txt’, используйте следующее:

 df['label'] = df['label'].apply(lambda values: [val for val in values if not isinstance(val, str) or not val.endswith('txt')])
 

Если единственными строками, которые могут встречаться в списке, являются те, которые заканчиваются на ‘txt’, а все остальные значения, которые вы хотите сохранить, являются не строками, а целыми числами, это проще:

 df['label'] = df['label'].apply(lambda values: [val for val in values if not isinstance(val, str)])
 

Редактировать:

Ответ на отредактированный вопрос:

 df['label'] = df['label'].apply(lambda string: ','.join([word for word in string.split(',') if not word.rstrip(' ').endswith('txt')]))
 

Комментарии:

1. извините, что я отредактировал вопрос, на самом деле мой ярлык находится в предложении

2. Пожалуйста, будьте более точны в определении вашей проблемы. Тот факт, что это предложение, меняет подход. И до сих пор неясно, что такое элемент этой строки. Разделены ли члены запятыми? Почему иногда после запятой есть пробелы, а иногда нет. Важно ли их сохранять или нет? Все это актуально.

Ответ №2:

Вы можете создать функцию, которая удаляет элемент, заканчивающийся на ‘txt’, из списка, а затем вызывает эту функцию для каждого значения label .

 def fun(row):
    ret_list=[]
    for item in str(row).split(','):
        if not str(item).endswith('txt'):
            ret_list.append(item)
    return ','.join(ret_list)

df['label']=[fun(x) for x in df.label.values]
 

Комментарии:

1. извините, что я отредактировал вопрос, на самом деле мой ярлык находится в предложении