代码之家  ›  专栏  ›  技术社区  ›  Nayr borcherds

Pandas Dataframe按组快速计数行数

  •  0
  • Nayr borcherds  · 技术社区  · 1 年前

    我有一个数据帧,看起来像

    Class_ID  Student_ID  feature
    1         4           31
    1         4           86
    1         4           2
    1         2           11
    1         2           0
    5         3           2
    5         9           3
    5         9           2
    

    我想统计一下每个学生出现的次数 Class_ID ,所以期望的结果看起来像这样:

    Class_ID  Student_ID  feature  count
    1         4           31       3
    1         4           86       3
    1         4           2        3
    1         2           11       2
    1         2           0        2
    5         3           2        1
    5         9           3        2
    5         9           2        2
    

    我是这样做的:

    df['dummy'] = 1
    df['count'] = df.groupby(['Class_ID', 'Student_ID'], group_keys=False)['dummy'].transform(lambda x: x.sum())
    

    它工作得很好,但我的实际数据帧相当大(~1M行),代码也很慢,所以我想问一下,有没有更快/更好的方法?谢谢。

    2 回复  |  直到 1 年前
        1
  •  4
  •   e-motta    1 年前

    您可以避免创建虚拟列 transform 具有 "size" 相反:

    df["count"] = df.groupby(["Class_ID", "Student_ID"]).transform("size")
    

    在我的机器上,100万行的速度大约是3/4倍。

    输出:

       Class_ID  Student_ID  feature  count
    0         1           4       31      3
    1         1           4       86      3
    2         1           4        2      3
    3         1           2       11      2
    4         1           2        0      2
    5         5           3        2      1
    6         5           9        3      2
    7         5           9        2      2
    
        2
  •  1
  •   PaulS    1 年前

    你可以考虑使用 numpy 方法,通过 np.unique :

    _, idx, counts = np.unique(
        np.array(list(zip(df['Class_ID'], df['Student_ID']))), 
        axis=0, 
        return_inverse=True, 
        return_counts=True
    )
    
    df['count'] = counts[idx]