pandas dataframe to frozenset в зависимости от условий

У меня есть набор данных, как:

 node    community
  1         2
  2         4
  3         5
  4         2
  5         3
  7         1
  8         3
  10        4
  12        5

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

 [frozenset([1,4]), frozenset([2,10]), frozenset([3,12]),frozenset([5,8]),frozenset([1])]

Есть ли способ, которым я могу сделать это, не меняя dataframe в список списка. Благодарю.

3 ответа

Решение

С помощью GroupBy + apply с frozenset:

res = df.groupby('community')['node'].apply(frozenset).values.tolist()

print(res)

[frozenset({7}), frozenset({1, 4}), frozenset({8, 5}),
 frozenset({2, 10}), frozenset({3, 12})]

Я бы предложил перебрать ваш GroupBy объект и испуская карту вместо.

communities = {k: frozenset(g['node']) for k, g in df.groupby('community')}
print(communities)
{1: frozenset({7}),
 2: frozenset({1, 4}),
 3: frozenset({5, 8}),
 4: frozenset({2, 10}),
 5: frozenset({3, 12})}

Или, если вы хотите список (вы потеряете информацию о ключах), то

communities = [frozenset(g['node']) for _, g in df.groupby('community')]

Оба других ответа сработали для меня, но скорость была проблемой. Решение, которое в моем случае было более быстрым, состояло в том, чтобы сначала объединить элементы, используя сумму, а затем преобразовать в замороженное множество.

      df = pd.DataFrame({'mycol': [10,20,30,40,50], 'myindex': [1,1,2,2,3]})
df['mycol_list'] = [[i] for i in df.mycol]
df2 = df.groupby('myindex').mycol_list.sum().to_frame()
df2['mycol_frozenset'] = [frozenset(i) for i in df2.mycol_list]
df2
Другие вопросы по тегам