Pythonの除算・商・余り

データを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]