データを分割したい
データを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 '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
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]
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])