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

#python #pandas #dataframe #set #set-intersection

Вопрос:

У меня есть фрейм данных с одним столбцом. Каждое значение в этом столбце представляет собой список. Например,

      A
0   [1, 3, 4]
1   [43, 1, 42]
2   [50, 3]
 

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

     0           1           2 
0   [1, 2, 3]   [1]         [3]
1   [1]         [43, 1, 42] []
2   [3]         []          [50, 3]
 

Есть ли элегантный способ сделать это, а не зацикливаться?

Ответ №1:

Мы можем apply настроить преобразование всех значений в A , чтобы set затем broadcast установить пересечение:

 import pandas as pd

df = pd.DataFrame({'A': [[1, 3, 4], [43, 1, 42], [50, 3]]})

# Convert to set
a = df['A'].apply(set).values
# Broadcast set intersection
new_df = pd.DataFrame(a[:, None] amp; a)
 

new_df :

            0            1        2
0  {1, 3, 4}          {1}      {3}
1        {1}  {1, 42, 43}       {}
2        {3}           {}  {50, 3}
 

Или np.vectorize может быть использован для преобразования в list , если это необходимо (его также можно использовать для преобразования в set вместо apply ):

 import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [[1, 3, 4], [43, 1, 42], [50, 3]]})

# Convert to set (using vectorize instead of apply):
a = np.vectorize(set, otypes=['O'])(df['A'])
# Broadcast set intersection and convert back to list
new_df = pd.DataFrame(
    np.vectorize(list, otypes=['O'])(a[:, None] amp; a)
)
 

new_df :

            0            1        2
0  [1, 3, 4]          [1]      [3]
1        [1]  [1, 42, 43]       []
2        [3]           []  [50, 3]