Скажем, у меня есть два разных столбца в большом наборе транспортных данных, один с идентификатором поездки, а другой с идентификатором пользователя.Как можно посчитать, сколько раз два человека участвовали в одной поездке вместе, т.е. разные идентификаторы пользователей, но одинаковые идентификаторы командировок?
df = pd.DataFrame([[1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5], ['A', 'B', 'C', 'A', 'B', 'A', 'B', 'B', 'C', 'D', 'D','A']]).T
df.columns = ['trip_id', 'user_id']
print(df)
trip_id user_id
0 1 A
1 1 B
2 1 C
3 2 A
4 2 B
5 3 A
6 3 B
7 4 B
8 4 C
9 4 D
10 5 D
11 5 A
Идеальным выходом будет своего рода сводная сводная таблица или кросс-таблица, котораяотображает каждый user_id и их количество поездок с другими user_id, чтобы увидеть, кто имеет наибольшее количество поездок вместе.
Я пробовал что-то вроде этого:
df5 = pd.crosstab(index=df4['trip_id'], columns=df4['user_id'])
df5['sum'] = df5[df5.columns].sum(axis=1)
df5
user_id A B C D sum
trip_id
1 1 1 1 0 3
2 1 1 0 0 2
3 1 1 0 0 2
4 0 1 1 1 3
5 1 0 0 1 2
, которое я могу использовать для получения среднего числа пользователей за поездку, но не частоты уникальных user_ids, объединенных в поездку.
Я также попробовал несколько вариантов с этим:
df.trip_id = df.trip_id+'_'+df.groupby(['user_id','trip_id']).cumcount().add(1).astype(str)
df.pivot('trip_id','user_id')
но я не получаю то, что хочу.Я не уверен, нужно ли мне подходить к этому путем итерации с циклом for или мне нужно будет складывать фрейм данных из кросс-таблицы, чтобы получить эти агрегированные значения.Кроме того, я стараюсь избегать агрегации trip_id и user_id в исходных данных в виде числовых типов данных, поскольку они должны рассматриваться не как целые, а как строки.
Спасибо за любые идеи, которые вы можете предоставить!