[Python]Pandasで小数点の連番を振る


はじめに

こんばんは
簡単ですがpandasのデータフレームで
小数点の連番(シーケンス)を振りたかったので振りました。
ちょろっと調べてもそれっぽいのが出てこなかったので記事にしておきます。
(簡単すぎて誰も記事にしないのかも。。。)

環境はgoogle colabです。
結果はGistにも上げてます。

pandasのversion確認

# version確認
import pandas as pd
pd.__version__
>> '1.1.5'
import pandas as pd
import numpy as np
# データフレーム作成
df = pd.DataFrame(np.arange(100).reshape(100, 1),
                  columns=['No'],)
df
No
0 0
1 1
2 2
3 3
4 4
... ...
95 95
96 96
97 97
98 98
99 99

100 rows × 1 columns

pandasで連番を作成

# pandasで連番を作成
pd_seq = pd.RangeIndex(start=0, stop=len(df.index), step=1)

# 新しい列を追加
df['PD_SEQ'] = pd_seq
# 連番列の型をfloatにして100で割る
df['PD_SEQ'] = df['PD_SEQ'].astype('float64') / 100

df['PD_SEQ']
0    0.0000000000
1    0.0100000000
2    0.0200000000
3    0.0300000000
4    0.0400000000
         ...     
95   0.9500000000
96   0.9600000000
97   0.9700000000
98   0.9800000000
99   0.9900000000
Name: PD_SEQ, Length: 100, dtype: float64

numpyで連番を作成

# numpyで連番を作成
np_seq = np.arange(0, 1, 0.01)
df['NP_SEQ'] = np_seq

print(np_seq)

df['NP_SEQ']
[0.   0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1  0.11 0.12 0.13
 0.14 0.15 0.16 0.17 0.18 0.19 0.2  0.21 0.22 0.23 0.24 0.25 0.26 0.27
 0.28 0.29 0.3  0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4  0.41
 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5  0.51 0.52 0.53 0.54 0.55
 0.56 0.57 0.58 0.59 0.6  0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69
 0.7  0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8  0.81 0.82 0.83
 0.84 0.85 0.86 0.87 0.88 0.89 0.9  0.91 0.92 0.93 0.94 0.95 0.96 0.97
 0.98 0.99]

0    0.0000000000
1    0.0100000000
2    0.0200000000
3    0.0300000000
4    0.0400000000
         ...     
95   0.9500000000
96   0.9600000000
97   0.9700000000
98   0.9800000000
99   0.9900000000
Name: NP_SEQ, Length: 100, dtype: float64

非推奨:自前で作成

小数点の計算誤差が出るのでしない方がいいです。(例:0.35000000000000003)
numpyとかを使いましょう

# 非推奨:自前で作成
for_seq = [i*0.01 for i in range(100)]
print(for_seq)

df['FOR_SEQ'] = for_seq
df['FOR_SEQ']
[0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35000000000000003, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41000000000000003, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47000000000000003, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.5700000000000001, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.6900000000000001, 0.7000000000000001, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.8200000000000001, 0.8300000000000001, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.9400000000000001, 0.9500000000000001, 0.96, 0.97, 0.98, 0.99]

0    0.0000000000
1    0.0100000000
2    0.0200000000
3    0.0300000000
4    0.0400000000
         ...     
95   0.9500000000
96   0.9600000000
97   0.9700000000
98   0.9800000000
99   0.9900000000
Name: FOR_SEQ, Length: 100, dtype: float64

小数点設定変更(桁数:2)

pandasの小数点表示を変更してデータフレームを確認します

# 小数点設定変更
pd.options.display.precision = 2
pd.options.display.float_format = '{:.2f}'.format

df
No PD_SEQ NP_SEQ FOR_SEQ
0 0 0.00 0.00 0.00
1 1 0.01 0.01 0.01
2 2 0.02 0.02 0.02
3 3 0.03 0.03 0.03
4 4 0.04 0.04 0.04
... ... ... ... ...
95 95 0.95 0.95 0.95
96 96 0.96 0.96 0.96
97 97 0.97 0.97 0.97
98 98 0.98 0.98 0.98
99 99 0.99 0.99 0.99

100 rows × 4 columns

小数点設定変更(桁数:20)

20桁までいくと計算誤差が見えます
ここだけ見ると全部同じ結果になってる模様
そりゃそうか

# 小数点設定変更
pd.options.display.precision = 20
pd.options.display.float_format = '{:.20f}'.format

df
No PD_SEQ NP_SEQ FOR_SEQ
0 0 0.00000000000000000000 0.00000000000000000000 0.00000000000000000000
1 1 0.01000000000000000021 0.01000000000000000021 0.01000000000000000021
2 2 0.02000000000000000042 0.02000000000000000042 0.02000000000000000042
3 3 0.02999999999999999889 0.02999999999999999889 0.02999999999999999889
4 4 0.04000000000000000083 0.04000000000000000083 0.04000000000000000083
... ... ... ... ...
95 95 0.94999999999999995559 0.95000000000000006661 0.95000000000000006661
96 96 0.95999999999999996447 0.95999999999999996447 0.95999999999999996447
97 97 0.96999999999999997335 0.96999999999999997335 0.96999999999999997335
98 98 0.97999999999999998224 0.97999999999999998224 0.97999999999999998224
99 99 0.98999999999999999112 0.98999999999999999112 0.98999999999999999112

100 rows × 4 columns