2014-02-18 15 views
1

Я пытаюсь отфильтровать большой фреймворк данных и не хочу, чтобы строки, содержащие определенные значения в столбце «Описание продукта».Удаление строк, содержащих значения в списке

Я посмотрел на how can i remove multiple rows with different labels in one command in pandas?

и

Remove rows not .isin('X')

и применяется код. Однако

df[-df['label'].isin(List)] 

не работает для меня, и я не уверен, что делать.

Вот мой точный код:

List2 = ['set up','setup','and install',....etc etc] 

(я также попытался List2 = (..etc) с круглыми скобками вместо скобок и он не работает)

Computers_No_UNSPSC =Compters_No_UNSPSC[- Computers_No_UNSPSC['Product Description'].isin(List2)] 

(я попробовал использовать ~ вместо того, чтобы - что не сработало)

Есть что-то, что я делаю неправильно/отсутствует. Когда я смотрю на свой dataframe Computers_No_UNSPSC, я вижу, что в списке, который я создал, есть строки, содержащие слова. Кажется, он не отфильтровывает то, чего я не хочу.

Спасибо за помощь!

** Я считаю, что List2 работает. У меня есть строки данных, в которых люди описывают свои компьютерные покупки. Я хочу, чтобы все компьютеры покупались не «ремонт компьютеров» или «компьютерное программное обеспечение». Таким образом, я создал список, который, кажется, чтобы захватить периферийные устройства/вещи, которые я не хочу ... ну, когда я говорю

print List2 

я получаю

['set up', 'setup', 'and install', ' server', 'labor', 'services', 'processing', 'license', 'renewal', 'repair', 'case', 'speakers', 'cord', 'support', 'cart', 'docking station', 'components', 'accessories', 'software', ' membership', ' headsets ', ' keyboard', ' mouse', ' peripheral', ' part', ' charger', ' battery', ' drive', ' print', ' cable', ' supp', ' usb', ' shelf', 'disk', 'memory', 'studio', 'training', 'adapter', 'wiring', 'mirror'] 

Означает ли это, что он распознает каждую строку как слово? поэтому, когда я применяю фильтр, он будет фильтровать каждое из слов в моем List2?

A =A[-A['Product Description'].isin(List2)] 

Это, кажется, часть, которая не работает, но снова, я не знаю, где я ошибся.

+0

Вы можете разместить данные примеры, где это не работает, и список где он не соответствует – EdChum

+0

Какая часть точно не работает? Вы упоминаете две части: - и '.isin (List2)' Так что обе части не работают или только одна? – KodyVanRy

ответ

1

Я не думаю, что вы понимаете, как это работает его проверку, если метка == ничего в этом списке ... нет, если этикетка содержит ничего в этом списке ...

Это звучит как метка может выглядеть

label = "set up computer" 

ISIN будет искать точные совпадения ... не частичные совпадения

label in ["set","up","computer"] #is false for example 
"set" in ["set","up","computer"] #is true for example 

записные: это, очевидно, не панд isin, но это работает так же ...

делать то, что вы хотите, вы должны проверить список слов против лейбла

any(word in label for word in blacklisted_words) 

, который будет гораздо медленнее

+1

Спасибо за это объяснение. Я точно не понял, что происходит. Я попытался сделать ... C2 = C2 [(-C2 ['Product Description']. Str.contains ('setup')) | (-C2 ['Product Description']. Str.contains ('setup')) ... и т. Д., Но это не сработало, и я считаю, что по той же причине – Alexis

+0

да :) Я думаю, что теперь вы начинаете понимать :) идти вперед и принимать, если это отвечает на ваш вопрос (даже если он не решает вашу проблему). –

+0

Нет ли более простого векторизованного способа сделать это с помощью панд? Должен ли я использовать цикл for для фильтрации всего, что содержит в себе эти слова? – Alexis

Смежные вопросы