pandas:データフレームを【クラス分割】する方法


前提

サンプルコード

データを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)になっている


Posted by futa