#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 — общее количество размещенных в каждой категории, нижний и верхний треугольники одинаковы и являются пересечениями количества пользователей, размещенных, например, в и С.
Я пытался
- df.сводная таблица(значения=[«пользователь»,»категория»],индекс=[«категория»], столбцы=[«категория»],aggfunc=np.count_nonzero)
- 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