データをN分割するときに、除算の商と余りをどうやって算出するんだっけ? とよくなるので、まとめてみます。
1から10の数字を用意し、それを3分割する例をやってみます。
# 分割に使うデータの準備 (1から10までの数字) # list型 li = list(np.arange(1, 11)) print(li) print(type(li)) # ndarray型 nda = np.arange(1, 11) print(nda) print(type(nda)) # pd.Series型 df = pd.Series(np.arange(1, 11)) print(df) print(type(df))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] <class 'list'> [ 1 2 3 4 5 6 7 8 9 10] <class 'numpy.ndarray'> 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 dtype: int32 <class 'pandas.core.series.Series'>
商と余り
除算に使う演算子は “/” です。
商と余りを算出する演算子は、それぞれ “//”, “%” です。
divmod() を使えば、商と余りをタプルで返してくれます。
# 除算 (被除数:dividend, 除数:divisor) (分母:numerator, 分子:denominator) print('10 / 3 =', 10 / 3) # 商 (quotient) print('10 // 3 =', 10 // 3) # 余り、剰余 (remainder) print('10 % 3 =', 10 % 3) # divmod()を使うと、商と余りをタプルで返してくれる。 print('divmod(10, 3) =', divmod(10, 3)) print('type(divmod(10, 3)) =', type(divmod(10, 3)))
10 / 3 = 3.3333333333333335 10 // 3 = 3 10 % 3 = 1 divmod(10, 3) = (3, 1) type(divmod(10, 3)) = <class 'tuple'>
分割してみる
divmod() を使って、list, ndarray, pd.Series のデータを分割してみます。
total = 10 split_num = 3 quotient, remainder = divmod(total, split_num) for i in range(split_num): print(li[i * quotient:i * quotient + quotient]) for i in range(split_num): print(nda[i * quotient:i * quotient + quotient]) for i in range(split_num): print(df[i * quotient:i * quotient + quotient].reset_index(drop=True))
[1, 2, 3] [4, 5, 6] [7, 8, 9] [1 2 3] [4 5 6] [7 8 9] 0 1 1 2 2 3 dtype: int32 0 4 1 5 2 6 dtype: int32 0 7 1 8 2 9 dtype: int32
余りの部分を入れたい場合は、コードを以下のように変えます。
for i in range(split_num): if i == split_num - 1: print(li[i * quotient:]) else: print(li[i * quotient:i * quotient + quotient])
[1, 2, 3] [4, 5, 6] [7, 8, 9, 10]