运行 groupby cumcount 多列

Run groupby cumcount on multiple columns

我有一个包含多列的数据框,所有列均按升序排列:

     40  41  42  43  44  45  46  47  48  49
0     1   1   1   1   1   1   1   1   1   1
1     1   1   1   1   1   1   1   1   1   1
2     1   1   1   1   1   2   1   1   1   1
3     1   1   1   1   1   2   1   1   1   1
4     1   1   1   1   1   2   2   1   1   1
..   ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
367  18  26  25  25  30  25  27  27  30  29
368  18  26  26  25  30  25  27  27  31  29
369  18  27  27  25  30  25  27  27  31  29
370  19  27  27  25  30  25  27  27  31  29
371  19  27  27  25  30  25  27  27  31  29

我想对每列的值和 运行 cumcount 进行分组。我知道我可以遍历所有列,但正如人们所说,您应该尽可能避免迭代。所以想知道有没有更优雅的解决方案

如果您有合理数量的列,在列上使用 apply 实际上还不错:

df.apply(lambda c: c.groupby(c).cumcount())

输出:

     40  41  42  43  44  45  46  47  48  49
0     0   0   0   0   0   0   0   0   0   0
1     1   1   1   1   1   1   1   1   1   1
2     2   2   2   2   2   0   2   2   2   2
3     3   3   3   3   3   1   3   3   3   3
4     4   4   4   4   4   2   0   4   4   4
367   0   0   0   0   0   0   0   0   0   0
368   1   1   0   1   1   1   1   1   0   1
369   2   0   0   2   2   2   2   2   1   2
370   0   1   1   3   3   3   3   3   2   3
371   1   2   2   4   4   4   4   4   3   4