Pandasで、飛び飛びの列番号を連番にしたい。


Pandasでデータの処理をしています。 A列がIDで、同じ数字が連続したり 、飛び飛びになっていたりします。  
A列の同じ数字はそのまま、飛んでいる数字の隙間を埋めるのに効果的な操作はあれば教えて頂けませんか？

[code]

        A   B   C   D   E   F
    1   1   0   0   0   4   1163.7
    2   1   0.8 0.8 2.2 0   0
    3   1   0.2 0.2 4.4 0   0
    4   1   0.8 0.4 0.4 0   0
    5   1   0.5 0.7 3.8 0   0
    6   2   1   1   8.9 0   0
    7   2   1.5 1.5 1.7 0   0
    8   2   2   2   8.7 0   0
    9   4   3   3   5.  0   0
    10  4   4.5 4.5 2.2 0   0
    11  4   6.0 6.5 0.8 0   0
    12  4   8   8   0.3 0   0
    13  4   5.3 0   0   1   116
    14  4   0   0   0   4   116
    15  13  0.8 0.8 1.1 0   0
    16  13  0.2 0.5 3.4 0   0
    17  13  0.4 0.8 3.2 0   0
    18  13  0.7 0.5 3.0 0   0
    19  15  1   1   1.5 0   0
    20  15  1.5 1.5 1.7 0   0
    21  15  2   2   7.9 0   0
    ・
    ・
    ・
    
[/code]

以下が目指すデータです

[code]

        A   B   C   D   E   F
    1   1   0   0   0   4   1163.7
    2   1   0.8 0.8 2.2 0   0
    3   1   0.2 0.2 4.4 0   0
    4   1   0.8 0.4 0.4 0   0
    5   1   0.5 0.7 3.8 0   0
    6   2   1   1   8.9 0   0
    7   2   1.5 1.5 1.7 0   0
    8   2   2   2   8.7 0   0
    9   3   3   3   5.  0   0
    10  3   4.5 4.5 2.2 0   0
    11  3   6.0 6.5 0.8 0   0
    12  3   8   8   0.3 0   0
    13  3   5.3 0   0   1   116
    14  3   0   0   0   4   116
    15  4   0.8 0.8 1.1 0   0
    16  4   0.2 0.5 3.4 0   0
    17  4   0.4 0.8 3.2 0   0
    18  4   0.7 0.5 3.0 0   0
    19  5   1   1   1.5 0   0
    20  5   1.5 1.5 1.7 0   0
    21  5   2   2   7.9 0   0
    ・
    ・
    ・
    
[/code]




問題としては
[ベクトルの欠番を詰めて欠番が無いように要素を置換する方法(R言語)](https://ja.stackoverflow.com/questions/53922/)
と同じかと思います。この質問に対する回答に `cumsum()` を使用したものがあり、pandas でも同様に
[pandas.DataFrame.cumsum](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.cumsum.html) を使う事ができます。

[code]

    import pandas as pd
    
    df = pd.DataFrame({
      'A': [1,1,1,1,1,2,2,2,4,4,4,4,4,4,13,13,13,13,15,15,15],
      'B': [0,0.8,0.2,0.8,0.5,1,1.5,2,3,4.5,6.0,8,5.3,0,0.8,0.2,0.4,0.7,1,1.5,2],
      'C': [0,0.8,0.2,0.4,0.7,1,1.5,2,3,4.5,6.5,8,0,0,0.8,0.5,0.8,0.5,1,1.5,2],
      'D': [0,2.2,4.4,0.4,3.8,8.9,1.7,8.7,5.0,2.2,0.8,0.3,0,0,1.1,3.4,3.2,3.0,1.5,1.7,7.9],
      'E': [4,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,0,0,0,0,0],
      'F': [1163.7,0,0,0,0,0,0,0,0,0,0,0,116,116,0,0,0,0,0,0,0],
    })
    
    df.A = df.A.ne(df.A.shift()).cumsum()
    print(df)
    
        A    B    C    D  E       F
    0   1  0.0  0.0  0.0  4  1163.7
    1   1  0.8  0.8  2.2  0     0.0
    2   1  0.2  0.2  4.4  0     0.0
    3   1  0.8  0.4  0.4  0     0.0
    4   1  0.5  0.7  3.8  0     0.0
    5   2  1.0  1.0  8.9  0     0.0
    6   2  1.5  1.5  1.7  0     0.0
    7   2  2.0  2.0  8.7  0     0.0
    8   3  3.0  3.0  5.0  0     0.0
    9   3  4.5  4.5  2.2  0     0.0
    10  3  6.0  6.5  0.8  0     0.0
    11  3  8.0  8.0  0.3  0     0.0
    12  3  5.3  0.0  0.0  1   116.0
    13  3  0.0  0.0  0.0  4   116.0
    14  4  0.8  0.8  1.1  0     0.0
    15  4  0.2  0.5  3.4  0     0.0
    16  4  0.4  0.8  3.2  0     0.0
    17  4  0.7  0.5  3.0  0     0.0
    18  5  1.0  1.0  1.5  0     0.0
    19  5  1.5  1.5  1.7  0     0.0
    20  5  2.0  2.0  7.9  0     0.0
    
[/code]




問題としては
[ベクトルの欠番を詰めて欠番が無いように要素を置換する方法(R言語)](https://ja.stackoverflow.com/questions/53922/)
と同じかと思います。この質問に対する回答に `cumsum()` を使用したものがあり、pandas でも同様に
[pandas.DataFrame.cumsum](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.cumsum.html) を使う事ができます。

[code]

    import pandas as pd
    
    df = pd.DataFrame({
      'A': [1,1,1,1,1,2,2,2,4,4,4,4,4,4,13,13,13,13,15,15,15],
      'B': [0,0.8,0.2,0.8,0.5,1,1.5,2,3,4.5,6.0,8,5.3,0,0.8,0.2,0.4,0.7,1,1.5,2],
      'C': [0,0.8,0.2,0.4,0.7,1,1.5,2,3,4.5,6.5,8,0,0,0.8,0.5,0.8,0.5,1,1.5,2],
      'D': [0,2.2,4.4,0.4,3.8,8.9,1.7,8.7,5.0,2.2,0.8,0.3,0,0,1.1,3.4,3.2,3.0,1.5,1.7,7.9],
      'E': [4,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,0,0,0,0,0],
      'F': [1163.7,0,0,0,0,0,0,0,0,0,0,0,116,116,0,0,0,0,0,0,0],
    })
    
    df.A = df.A.ne(df.A.shift()).cumsum()
    print(df)
    
        A    B    C    D  E       F
    0   1  0.0  0.0  0.0  4  1163.7
    1   1  0.8  0.8  2.2  0     0.0
    2   1  0.2  0.2  4.4  0     0.0
    3   1  0.8  0.4  0.4  0     0.0
    4   1  0.5  0.7  3.8  0     0.0
    5   2  1.0  1.0  8.9  0     0.0
    6   2  1.5  1.5  1.7  0     0.0
    7   2  2.0  2.0  8.7  0     0.0
    8   3  3.0  3.0  5.0  0     0.0
    9   3  4.5  4.5  2.2  0     0.0
    10  3  6.0  6.5  0.8  0     0.0
    11  3  8.0  8.0  0.3  0     0.0
    12  3  5.3  0.0  0.0  1   116.0
    13  3  0.0  0.0  0.0  4   116.0
    14  4  0.8  0.8  1.1  0     0.0
    15  4  0.2  0.5  3.4  0     0.0
    16  4  0.4  0.8  3.2  0     0.0
    17  4  0.7  0.5  3.0  0     0.0
    18  5  1.0  1.0  1.5  0     0.0
    19  5  1.5  1.5  1.7  0     0.0
    20  5  2.0  2.0  7.9  0     0.0
    
[/code]

