pandas:【件数集計,ソート,先頭末尾】データ抽出方法
前提
- データフレームの作成
- 列指定方法(df['a’]、df.a)
- pd.Series
- pd.concat
サンプルコード
集計
データ作成
import numpy as np
import pandas as pd
a = np.random.choice(np.arange(10), 1000, p=[0.10,0.05,0.15,0.07,0.13,0.01,0.19,0.04,0.16,0.10]).reshape(200,5)
df = pd.DataFrame(a).rename(columns={0:'a',1:'b',2:'c',3:'d',4:'e'})
print(df)
a b c d e 0 0 8 3 3 9 1 7 3 8 8 9 2 8 9 1 4 4 3 5 6 6 7 0 4 1 6 6 8 6 .. .. .. .. .. .. 195 0 4 4 8 2 196 2 8 8 8 3 197 8 3 2 2 8 198 6 4 6 2 0 199 1 2 0 8 6 [200 rows x 5 columns]
- データの特徴
- 0~9までの数字ランダムで200行x5列の合計1,000個
- 出現率を指定していて、6とか8が出やすくなっている
- ヘッダを{a,b,c,d,e}に変更
集計の実行
vc = df['a'].value_counts()
print(vc)
print(type(vc))
6 39 2 29 8 27 0 24 4 21 9 20 1 12 3 12 7 10 5 6 Name: a, dtype: int64 <class 'pandas.core.series.Series'>
- それぞれの件数を集計
- df.a.value_counts()でもOK
- 出力データの型は「Series」です
ソート
データ作成
import numpy as np
import pandas as pd
a = pd.Series(np.array([2,3,2,1,1,2,2,1,2,3]), name='no')
b = pd.DataFrame(np.random.randint(10,100,(10,5)), columns=['a','b','c','d','e'])
df = pd.concat([a,b], axis=1)
print(df)
no a b c d e 0 2 36 29 14 49 97 1 3 84 89 62 54 23 2 2 43 25 27 98 33 3 1 69 18 50 87 57 4 1 55 35 41 20 48 5 2 90 97 94 70 27 6 2 25 95 29 30 13 7 1 84 69 21 58 16 8 2 27 86 68 82 10 9 3 61 40 92 37 80
- 次の2つを確認
- 1列を指定してソート(「no」列)
- 複数を指定してソート(「no」列と「c」列)
1列を指定してソート
c = df.sort_values('no')
print(c)
no a b c d e 3 1 69 18 50 87 57 4 1 55 35 41 20 48 7 1 84 69 21 58 16 0 2 36 29 14 49 97 2 2 43 25 27 98 33 5 2 90 97 94 70 27 6 2 25 95 29 30 13 8 2 27 86 68 82 10 1 3 84 89 62 54 23 9 3 61 40 92 37 80
- 「no」列でソートができている
- 一番左のインデックス番号は変わらない
- df.reset_indexでインデックス振り直しは可能
- 別記事に書いたらリンク貼る★
複数を指定してソート
d = df.sort_values(['no','c'])
print(d)
no a b c d e 7 1 84 69 21 58 16 4 1 55 35 41 20 48 3 1 69 18 50 87 57 0 2 36 29 14 49 97 2 2 43 25 27 98 33 6 2 25 95 29 30 13 8 2 27 86 68 82 10 5 2 90 97 94 70 27 1 3 84 89 62 54 23 9 3 61 40 92 37 80
- 「no」列、「b」列の順でソートができている
- ['no’,’c’]のようにリスト形式で指定する
- 一番左のインデックス番号は変わらない
- df.reset_indexでインデックス振り直しは可能
- 別記事に書いたらリンク貼る★
先頭(行頭)、末尾(行末)
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(100).reshape(20,5), columns=('a','b','c','d','f'))
print(df)
print(df.shape)
a b c d f 0 0 1 2 3 4 1 5 6 7 8 9 2 10 11 12 13 14 3 15 16 17 18 19 4 20 21 22 23 24 5 25 26 27 28 29 6 30 31 32 33 34 7 35 36 37 38 39 8 40 41 42 43 44 9 45 46 47 48 49 10 50 51 52 53 54 11 55 56 57 58 59 12 60 61 62 63 64 13 65 66 67 68 69 14 70 71 72 73 74 15 75 76 77 78 79 16 80 81 82 83 84 17 85 86 87 88 89 18 90 91 92 93 94 19 95 96 97 98 99 (20, 5)
- サイズ(20,5)のデータ(データフレーム)を作成
先頭(行頭)取り出し
a = df.head()
b = df.head(3)
print(a)
print(a.shape)
print(b)
print(b.shape)
a b c d f
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
(5, 5)
a b c d f
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
(3, 5)
- a
- 引数なしの場合、先頭から5行取り出される
- b
- 取得する行数を引数で指定可能
- 3を指定したので3行取り出される
末尾(行末)取り出し
c = df.tail()
d = df.tail(3)
print(c)
print(c.shape)
print(d)
print(d.shape)
a b c d f
15 75 76 77 78 79
16 80 81 82 83 84
17 85 86 87 88 89
18 90 91 92 93 94
19 95 96 97 98 99
(5, 5)
a b c d f
17 85 86 87 88 89
18 90 91 92 93 94
19 95 96 97 98 99
(3, 5)
- c
- 引数なしの場合、行末から5行取り出される
- d
- 取得する行数を引数で指定可能
- 3を指定したので3行取り出される
