Pandas — проверяет, являются ли заданные значения в столбце подмножеством заданных значений в другом столбце

#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.e df.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