Посчитать частоту двух разных значений в столбце, которые имеют одинаковое значение в другом столбце? - PullRequest
0 голосов
/ 06 октября 2018

Скажем, у меня есть два разных столбца в большом наборе транспортных данных, один с идентификатором поездки, а другой с идентификатором пользователя.Как можно посчитать, сколько раз два человека участвовали в одной поездке вместе, т.е. разные идентификаторы пользователей, но одинаковые идентификаторы командировок?

    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 в исходных данных в виде числовых типов данных, поскольку они должны рассматриваться не как целые, а как строки.

Спасибо за любые идеи, которые вы можете предоставить!

1 Ответ

0 голосов
/ 06 октября 2018

Вот пример набора данных

import pandas as pd
df = pd.DataFrame([[1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3], ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B']]).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        2       C
6        3       A
7        3       B
8        3       C
9        3       A
10       3       B

Я думаю, что вы спрашиваете:

df.groupby(['trip_id', 'user_id']).size()

trip_id  user_id
1        A          1
         B          1
         C          1
2        A          1
         B          1
         C          1
3        A          2
         B          2
         C          1
dtype: int64

Я прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...