Pythonの除算、商、余り、データ分割

データを分割したい

データをN分割するときに、除算の商と余りをどうやって算出するんだっけ?、とよくなるので、まとめてみます。
1から10の数字を用意し、それを3分割する例をやってみます。

Python

    # 分割に使うデータの準備 (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() を使えば、商と余りをタプルで返してくれます。

Python

    # 除算 (被除数: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 のデータを分割してみます。

Python

    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

余りの部分を入れたい場合は、コードを以下のように変えます。

Python

    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]