计算同一列中共享同一值的两个不同值的频率?

时间:2018-10-05 23:50:41

标签: python pandas

说,我在一个大型交通数据集中有两个不同的列,一个具有旅行ID,另一个具有用户ID。我该如何计算两个人一起骑同一趟旅程的次数,即不同的用户ID但同一趟ID?

    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_id一起骑行的频率。

我还尝试了一些变化:

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 :(得分:0)

这是示例数据集

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

我正确吗?