Сводка фрейма данных Python

#python #pandas #dataframe

Вопрос:

У меня есть фрейм данных (таблица df ниже): Каждый пользователь может публиковать сообщения в любой категории. Я должен рассчитать, СКОЛЬКО РАЗНЫХ ПОЛЬЗОВАТЕЛЕЙ имеет сообщение в категории A и в то же время имеет сообщения в категориях B, C и D. Таблица, подобная:

Пользователь Категория
1 A
1 B
33 B
33 C
33 D
54 A
54 B
87 A
87 B
87 C
87 D

Общая таблица составляет 950 000 строк, она либо дает результаты Nan в сводке (вариант 1), либо переполняет память (вариант 2). Необходимым результатом является

Категория A B C D
A 3 3 1 1
B 3 4 2 1
C 1 2 2 2
D 1 1 2 2

Диагональ: A-B-C-D — общее количество размещенных в каждой категории, нижний и верхний треугольники одинаковы и являются пересечениями количества пользователей, размещенных, например, в и С.

Я пытался

  1. df.сводная таблица(значения=[«пользователь»,»категория»],индекс=[«категория»], столбцы=[«категория»],aggfunc=np.count_nonzero)
  2. a = df.значения

d = {(i, j): np.среднее значение(a[:, i] == a[:, j]) для i, j в комбинациях(диапазон(a.форма[1]), 2)}

res, c, vals = np.нули((a.форма[1], a.форма[1])),
список(карта(список, zip(*d.ключи ()))), список(d.значения())

res[c[0], c[1]] = vals

res_df = pd.фрейм данных(res, столбцы=df.столбцы, индекс=df.столбцы)

Не могли бы вы, пожалуйста, помочь с идеями. Спасибо.

Ответ №1:

Одна из идей-использовать merge с crosstab подобными:

 df = df.merge(df, on='User')
df = pd.crosstab(df['Category_x'], df['Category_y'])
print (df)
Category_y  A  B  C  D
Category_x            
A           3  3  1  1
B           3  4  2  2
C           1  2  2  2
D           1  2  2  2