#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'])