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