Методы сопоставления в нескольких столбцах в Pandas DataFrame

У меня есть кадр данных Pandas, где значения являются списками:

import pandas as pd DF = pd.DataFrame({'X':[[1, 5], [1, 2]], 'Y':[[1, 2, 5], [1, 3, 5]]}) DF XY 0 [1, 5] [1, 2, 5] 1 [1, 2] [1, 3, 5] 

Я хочу проверить, являются ли списки в X подмножествами списков в Y. С отдельными списками мы можем сделать это, используя set(x).issubset(set(y)) . Но как мы будем это делать через столбцы данных Pandas?

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

 foo = [set(DF['X'][i]).issubset(set(DF['Y'][i])) for i in range(len(DF['X']))] foo = pd.DataFrame(foo) foo.columns = ['x_sub_y'] pd.merge(DF, foo, how = 'inner', left_index = True, right_index = True) XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 

Есть ли более простой способ достичь этого? Возможно использование .map или .apply ?

3 Solutions collect form web for “Методы сопоставления в нескольких столбцах в Pandas DataFrame”

Используйте set и issubset :

 DF.assign(x_sub_y = DF.apply(lambda x: set(xX).issubset(set(xY)), axis=1)) 

Вывод:

  XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 

Опция 1
set преобразование и difference используя np.where

 df_temp = DF.applymap(set) DF['x_sub_y'] = np.where(df_temp.X - df_temp.Y, False, True) DF XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 

Вариант 2
Быстрее, преобразование astype

 DF['x_sub_y'] = ~(DF.X.apply(set) - DF.Y.apply(set)).astype(bool) DF XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 

Вариант 3
Развлечения с np.vectorize

 def foo(x): return not x v = np.vectorize(foo) DF['x_sub_y'] = v(DF.X.apply(set) - DF.Y.apply(set)) DF XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 

Расширение ответа Скотта Бостона на скорость, используя тот же подход:

 def foo(x, y): return set(x).issubset(y) v = np.vectorize(foo) DF['x_sub_y'] = v(DF.X, DF.Y) DF XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 

Маленький

 1000 loops, best of 3: 460 µs per loop # Before 10000 loops, best of 3: 103 µs per loop # After 

Большой ( df * 10000 )

 1 loop, best of 3: 1.26 s per loop # Before 100 loops, best of 3: 13.3 ms per loop # After 

Или вы можете попробовать set

 DF['x_sub_y']=DF.X+DF.Y DF['x_sub_y']=DF['x_sub_y'].apply(lambda x : list(set(x)))==DF.Y DF Out[691]: XY x_sub_y 0 [1, 5] [1, 2, 5] True 1 [1, 2] [1, 3, 5] False 
  • Измерение увеличения размера кучи после загрузки большого объекта
  • Получить все комбинации элементов из двух списков?
  • float64 с pandas to_csv
  • pandas: объединение (объединение) двух кадров данных на нескольких столбцах
  • Гистограмма со сложными компонентами
  • сохранить / разрезать конкретные столбцы в пандах
  • Нужна помощь с скриптом python (pandas)
  • Python Pandas - Удаление нескольких рядов из фрейма данных одной командой
  • Python - лучший язык программирования в мире.