pandas:データフレームを【クラス分割】する方法
前提
- Numpy
- np.random.randint
- データフレーム連結(pd.concat、reset_index)
サンプルコード
データをclass列で分割
データ作成
import numpy as np
import pandas as pd
df1 = pd.concat([pd.DataFrame(np.random.randint(10,20,(2,3))), pd.DataFrame({'class':
['AAA','BBB']})], axis=1)
df2 = pd.concat([pd.DataFrame(np.random.randint(20,30,(2,3))), pd.DataFrame({'class':['BBB','CCC']})], axis=1)
df3 = pd.concat([pd.DataFrame(np.random.randint(30,40,(2,3))), pd.DataFrame({'class':['AAA','BBB']})], axis=1)
df = pd.concat([df1, df2, df3], axis=0).reset_index()
print(df)
index 0 1 2 class 0 0 16 16 11 AAA 1 1 10 11 15 BBB 2 0 25 24 25 BBB 3 1 21 28 27 CCC 4 0 31 34 36 AAA 5 1 35 39 30 BBB
- class列の種類は「AAA」「BBB」「CCC」の3つ
分割データを格納したクラスオブジェクトの作成
class_groupby = df.groupby("class")
print(type(class_groupby))
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>
- 「DataFrameGroupBy」オブジェクトになっている
- for文で取り出せる
- 反対にそのままでは使えない
データ分割と分割データの格納
cnt = 0
data = []
for a in class_groupby:
cnt+=1
print('loop_cnt:'+str(cnt))
print(a)
type(a)
data.append(a) #データ格納
loop_cnt:1
('AAA', index 0 1 2 class
0 0 16 16 11 AAA
4 0 31 34 36 AAA)
loop_cnt:2
('BBB', index 0 1 2 class
1 1 10 11 15 BBB
2 0 25 24 25 BBB
5 1 35 39 30 BBB)
loop_cnt:3
('CCC', index 0 1 2 class
3 1 21 28 27 CCC)
- タプル形式で格納される
- 1つ目は分類したクラスの文字列
- 2つ目は分割したデータフレーム
- リスト型の「data」に格納
data(リスト)からデータを取り出す
1グループ取り出す
print(data[0])
print(type(data[0]))
('AAA', index 0 1 2 class
0 0 16 16 11 AAA
4 0 31 34 36 AAA)
<class 'tuple'>
- data[0]
- 0は最初のクラス(0から始まる)
- タプルとして取り出される
- クラスは「AAA」
- データフレームは2行
クラスだけ取り出す
print(data[2][0])
print(type(data[2][0]))
CCC <class 'str'>
- data[2][0]
- 2は3番目(0から始まる)のグループ(CCC)
- 0はクラス
- クラスの文字列(CCC)が取り出される
- typeの結果も文字列(str)になっている
データフレームだけ取り出す
print(data[1][1])
print(type(data[1][1]))
index 0 1 2 class 1 1 10 11 15 BBB 2 0 25 24 25 BBB 5 1 35 39 30 BBB <class 'pandas.core.frame.dataframe'="">
- data[1][1]
- 1は2番目(0から始まる)のグループ(BBB)
- 1はデータフレーム
- データフレームが取り出される
- typeの結果もデータフレーム(dataframe)になっている
