[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
非推奨:自前で作成
# 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で連番を作成
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
非推奨:自前で作成
# 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
Author And Source
この問題について([Python]Pandasで小数点の連番を振る), 我々は、より多くの情報をここで見つけました https://qiita.com/mototoke/items/4a653d1f8e2ae3de8ff0著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .