pandas:【件数集計,ソート,先頭末尾】データ抽出方法


前提

サンプルコード

集計

データ作成

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行取り出される


Posted by futa