如何获得与每个`user_id`相对应的每个标签值的比例

时间:2019-06-26 03:26:19

标签: python pandas pandas-groupby

我得到一个数据框,如下所示:

    user_id label
0   937922  1
1   937922  2
2   937922  2
3   937922  2
4   1369473 1
5   1330642 2
6   1330642 2
7   1330642 1
8   1330642 1
9   411741  1
10  411741  1
11  1552476 2
12  1552476 1
13  1552476 1
... ...
... ...

我想获得label2相对应的user_id的比例,如下所示:

user_id label
937922  0.7500
1369473 0
1330642 0.5000
411741  0
1552476 0.3333

我知道我应该以某种方式使用pd.groupby并将其除以pd.groubpy(['user_id']).count()[['type']]
但是我很难做到,我找不到想要的东西。
如果不介意有人可以帮助我吗?
预先感谢。

3 个答案:

答案 0 :(得分:2)

我会做groupby + mean

df.label.eq(2).groupby(df.user_id).mean()
user_id
411741     0.000000
937922     0.750000
1330642    0.500000
1369473    0.000000
1552476    0.333333
Name: label, dtype: float64

答案 1 :(得分:2)

groupbyvalue_counts为您提供所有计数:

df.groupby('user_id').label.value_counts(normalize=True)

输出:

user_id  label
411741   1        1.000000
937922   2        0.750000
         1        0.250000
1330642  1        0.500000
         2        0.500000
1369473  1        1.000000
1552476  1        0.666667
         2        0.333333
Name: label, dtype: float64

答案 2 :(得分:1)

pandas.crosstab用作:

df = (pd.crosstab(df['user_id'],df['label'], normalize='index').reset_index()
        .rename_axis(None, axis=1))

print(df)
       user_id         1         2
0       411741  1.000000  0.000000
1       937922  0.250000  0.750000
2      1330642  0.500000  0.500000
3      1369473  1.000000  0.000000
4      1552476  0.666667  0.333333