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

投稿者: Anonymous

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

    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
・
・
・

以下が目指すデータです

    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
・
・
・

解決

問題としては ベクトルの欠番を詰めて欠番が無いように要素を置換する方法(R言語) と同じかと思います。この質問に対する回答に cumsum() を使用したものがあり、pandas でも同様に pandas.DataFrame.cumsum を使う事ができます。

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
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *