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