#python #pandas #numpy
#python #pandas #numpy
Вопрос:
У меня есть фрейм данных, где индекс равен usergroup1_ids, а имена столбцов — usergroup2_ids. Значения фрейма данных являются сходными между пользователями из соответствующих групп. Например.
temp_sim_matrix = pd.DataFrame(data = np.random.rand(2,3), columns = ['1', '2', '3'])
print(temp_sim_matrix)
0 1 2
0 0.982759 0.993010 0.957348
1 0.896425 0.552502 0.455066
Теперь имена столбцов связаны с категорией на основе списка, где имена столбцов являются индексами для списка:
column_category = ["A", "B", "A"]
Я хочу сгенерировать словарь, который дает мне совокупную сумму для каждой категории для каждого значения индекса в фрейме данных. Вот так:
{0: Counter({'A': 1.9401077624739544,
'B': 0.9930103537159203}),
1: Counter({'A': 1.3514912433327915,
'B': 0.5525021211525775})}
Есть ли эффективный pythonic способ сделать это, потому что в настоящее время я делаю это, перебирая каждую строку в фрейме данных, а затем помещая совокупные значения в счетчик. Возможно, мне не хватает какой-то функции от pandas, которую можно использовать здесь. Моя реализация:
row_index_dict = {} # Initializing final dictionary
for index, row in temp_sim_matrix.iterrows(): # Iterating over each row
cat_counter = Counter() # Creating counter to store cumulative value
for i in range(len(column_category)): # Loop over columns
cat_counter[column_category[i]] = row[i] #Add value of row to respective counter key
row_index_dict[index] = cat_counter #Adding counter to final dictionary
Ответ №1:
я думаю, вы можете объединить sum
со списком column_category
, потому что такая же длина, как имена столбцов, а затем преобразовать ее в словарь с помощью DataFrame.to_dict
:
column_category = ["A", "B", "A"]
d = df.groupby(column_category, axis=1).sum().to_dict('index')
print (d)
{0: {'A': 1.940107, 'B': 0.9930100000000001}, 1: {'A': 1.351491, 'B': 0.552502}}
При необходимости Counter
используйте:
d1 = {k: Counter(v) for k, v in d.items()}
Комментарии:
1. Это работает отлично! Я помещу вложенный словарь в счетчик, чтобы я мог использовать функцию most_comm(). Большое вам спасибо!
2. @specinthedark — Ya, также добавлено в ответ.