У меня есть список строк различной длины, хранящихся в 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
?
Помог ли мой ответ? Пожалуйста, отметьте его как принятый, если да, тогда ваш вопрос может быть удален из очереди без ответа.
Предполагая, что ваш столбец 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
Ваше условное выражение наоборот, оно должно быть
if item in f_name
. Но что еще более важно, вы никогда не должны перебирать фрейм данных, если можете этого избежать, особенно 300 тыс. строк.