Фильтровать строковые элементы из списка, используя другой список

У меня есть список строк различной длины, хранящихся в df. Общее количество строк в df равно 301501. Пример выглядит следующим образом:

 >>  df

         item
 >>  0   ['Tom', 'David']   
 >>  1   ['Robert', 'Jennifer', 'Jane']   
 >>  2   ['Robert', 'Tom', 'Patricia']   
 >>  3   ['Thomas', 'David', 'Chloe', 'Michelle'] 

Я также сохранил список женских имен в другом списке под названием f_name.

Я хочу создать еще один столбец в df, чтобы отфильтровать элементы, которых нет в f_name. Я пробовал следующее:

df['f_item'] = [item for item in df['item'] if f_name in item]

Получена ошибка "ValueError: длина значений (0) не соответствует длине индекса (301501)". Как создать новый столбец с отфильтрованным списком, который содержит только элементы из f_name?

Ваше условное выражение наоборот, оно должно быть if item in f_name. Но что еще более важно, вы никогда не должны перебирать фрейм данных, если можете этого избежать, особенно 300 тыс. строк.

ddejohn 17.03.2022 05:08

Помог ли мой ответ? Пожалуйста, отметьте его как принятый, если да, тогда ваш вопрос может быть удален из очереди без ответа.

ddejohn 18.03.2022 06:08
Почему в 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
2
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Предполагая, что ваш столбец itemна самом деле содержит списки строк (а не просто строки, которые выглядят как списки, например '[1, 2, 3]'), приведите f_name к set и выполните пересечение множества:

f_name = set(f_name)
df["item"].apply(f_name.intersection)

Демо:

In [3]: df
Out[3]:
                               item
0                      [Tom, David]
1          [Robert, Jennifer, Jane]
2           [Robert, Tom, Patricia]
3  [Thomas, David, Chloe, Michelle]

In [4]: f_name = {"Jane", "Michelle", "Patricia", "Jennifer", "Chloe"}

In [5]: df.item.apply(f_name.intersection)
Out[5]:
0                   {}
1     {Jane, Jennifer}
2           {Patricia}
3    {Michelle, Chloe}
Name: item, dtype: object

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