#python #pandas #dataframe #set #subset
#python #pandas #фрейм данных #установить #подмножество
Вопрос:
У меня есть df
фрейм данных со столбцами, которые содержат наборы. Вот пример:
df=pd.DataFrame([[{1,2,3,'a'},{5,'b','d',1,4}],
[{'z',9,'a','b',3},{'a',3,'z','b','d',9,4}]],columns=['set1','set2'])
Я хочу проверить, где столбец ‘set1’ является подмножеством столбца ‘set2’, и вернуть значение True или False. Результат в приведенном выше должен быть:
df
Out[69]:
set1 set2 issubset
0 {a, 1, 2, 3} {1, 4, 5, d, b} False
1 {a, 3, 9, b, z} {a, 3, 4, d, 9, b, z} True
Я пробовал различные комбинации лямбд и просто не могу заставить его работать. Например:
df['issubset']=df.apply(lambda x:x.set1.issubset(x.set2))
Результат AttributeError: 'Series' object has no attribute 'set1'
Вероятно, здесь много способов скрыть кошку. Скорость важна, так как реальные наборы имеют 10 000 значений в каждом, а df — тысячи строк. Спасибо
Комментарии:
1. для вашего кода вам необходимо указать ось с
apply
помощью i.edf.apply(lambda x : x['set1'].issubset(x['set2']),axis=1)
Ответ №1:
Я не изучал аналитику производительности, лежащую в основе этого подхода, но ваша проблема заключается в направлении, в котором выполняется apply. Чтобы сравнить set1 с set2, значение apply должно быть по оси = 1.
Однако функция apply (как и почти все остальные) по умолчанию имеет значение axis=0.
При добавлении axis = 1 я получаю желаемый результат:
df['issubset']=df.apply(lambda x:x.set1.issubset(x.set2), axis=1)
в результате
set1 set2 issubset
0 {1, 2, 3, a} {1, 4, 5, d, b} False
1 {3, z, 9, a, b} {3, 4, z, 9, a, d, b} True