この手の処理を行うのでしたら、pandas
をお勧めしておきます。
処理の仕方は以下のような感じ。
複雑なコードに見えるかもしれませんが、実際処理しているのは
データを分割している箇所とPivotテーブル作成の2行のみとシンプルに記述できます。
あと、データ生成部は、実際のコードではdf = pd.read_csv(...)
に置き換わります。
Python
1import pandas as pd
2import numpy as np
3
4# ダミーデータ生成
5N = 10000
6df = pd.DataFrame({
7 'Type': np.random.choice(('A','B','C','D','E','F','G','H','I','J'), N),
8 'X': np.random.uniform(0., 100., N),
9 'Y': np.random.uniform(0., 100., N),
10 'Z': np.random.uniform(0., 500., N)
11})
12
13# 先頭を表示
14print(df.head())
15# Type X Y Z
16# 0 I 7.451914 88.958929 141.680257
17# 1 F 15.252552 77.376957 366.378657
18# 2 H 49.445101 88.428184 23.725902
19# 3 A 7.169748 0.063047 451.124719
20# 4 J 33.558887 97.523463 97.186348
21
22# Z を 0~50 の範囲で 5 刻みで分割
23df['Range'] = pd.cut(x=df['Z'], bins=np.arange(0,55,5))
24# カウントデータを縦軸を範囲、横軸をTypeとしてpovotテーブルで表示
25result = pd.pivot_table(df, columns='Type', index='Range', values='Z', aggfunc='count')
26print(result)
27# Type A B C D E F G H I J
28# Range
29# (0, 5] 16 13 6 7 6 7 8 5 9 9
30# (5, 10] 6 12 8 14 12 11 9 13 8 7
31# (10, 15] 12 10 8 10 12 8 7 12 11 11
32# (15, 20] 12 18 14 6 7 11 7 10 9 15
33# (20, 25] 15 11 9 12 7 11 6 12 6 14
34# (25, 30] 7 10 4 14 7 5 12 12 9 14
35# (30, 35] 15 15 8 5 8 9 11 4 10 12
36# (35, 40] 7 13 15 9 9 9 6 12 11 10
37# (40, 45] 11 6 14 3 11 10 6 11 11 9
38# (45, 50] 15 18 9 11 12 15 8 10 9 15