Получить совокупную сумму по категории столбца в фрейме данных

#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, также добавлено в ответ.