Проверьте, есть ли элемент frozenset в списке

#python #pandas #list #frozenset

#python #панды #Список #frozenset

Вопрос:

У меня есть набор данных, который существует в столбце с комбинациями frozenset.

Данные

 import pandas as pd
import numpy as np
d = {'ID1': [frozenset(['a', 'b']), frozenset(['a','c']), frozenset(['c','d'])]}
df = pd.DataFrame(data=d)
  

Кроме того, у меня есть список с буквами, и теперь я хотел бы иметь список с индексом строк в наборе данных, где появился элемент из списка. Итак, предположим, что следующий список:

 lst = ['a', 'b']
indexSaver = []
  

Я могу обойти это с помощью цикла for, однако набор данных насчитывает более 27 миллионов, поэтому я совершенно уверен, что это сэкономит мне некоторое время для решения этой проблемы.

 for i in range(len(df)):
    for item in df['ID1'].iloc[i]:
        if item in lst:
            indexSaver.append(i)
  

Желаемый результат:
В этом случае элемент a и элемент b появились в строке 0 (дважды) и в строке 1. Желаемый результат здесь, чем был бы [0, 0, 1], сказав, что с выходом [0,1] я тоже мог бы работать.

У кого-нибудь более элегантная идея?

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

1. Учитывая ваше описание — разве желаемый результат не должен быть [1, 1, 0] ?

2. Хорошо… Я не понимаю, как это 1 присутствует?

3. В конечном итоге мне нужен список со всеми строками, в которых появляется элемент списка, поэтому в данном случае он находится в строках 0 и 1. И в строке 0 появляются 2 элемента, следовательно, два 0.

4. за исключением того, что последний frozenset не имеет никаких общих элементов с lst ?

5. Да, но это была строка с индексом 2.

Ответ №1:

Я предполагаю, что вы имели в виду, что желаемый результат равен [1,1,0], но при необходимости вы можете изменить логику

  df['indexSaver']=df['ID1'].apply(lambda f: 1 if  len(f.intersection(['a','b']))>0 else 0)
  

если вам это строго нужно как список

 indexSaver=list(df['indexSaver'])