pandas:一番簡単な【行データ】取り出し方


はじめに

ここで説明していること

前提

サンプルコード

範囲指定で行データ抽出

データ作成

import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(20).reshape(5,4), columns=['a','b','c','d'])
print(df)
print(df.shape)
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19
(5, 4)
  • データフレームサイズは(5,4)

指定行の取り出し

a = df[2:4]
print(a)
print(a.shape)
    a   b   c   d
2   8   9  10  11
3  12  13  14  15
(2, 4)
  • 抽出された行はインデックス番号2と3
  • [2:4]の指定は
    • 2以上
    • 4未満(4は含まない=3まで)
  • 参考
    • 飛び飛びのインデックス番号を指定したい場合は、df.locやdf.ilocを利用します

1行取り出しもできる

b = df[0:1]
print(b)
print(b.shape)
   a  b  c  d
0  0  1  2  3
(1, 4)
  • [0:1]を使う
    • 0以上
    • 1未満(1は含まない=0まで)
  • つまりインデックス番号0だけ抽出できる
  • 補足
    • (1,4)のデータフレームになっていますが、pandasではこの形は特殊です
    • (4,)のSeriesになる方が一般であることは覚えておきます

範囲「片側」指定で行データ抽出

データ作成

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10,20,(5,4)), columns=['a','b','c','d'])
print(df)
print(df.shape)
    a   b   c   d
0  16  12  14  11
1  15  13  14  14
2  13  17  11  11
3  17  17  10  12
4  19  19  13  12
(5, 4)
  • データフレームサイズは(5,4)

指定行以降を抽出

a = df[2:]
print(a)
print(a.shape)
    a   b   c   d
2  13  17  11  11
3  17  17  10  12
4  19  19  13  12
(3, 4)
  • データフレームサイズ(3,4)になった
  • データ抽出範囲は
    • インデックス番号2から
    • 最後の行まで

指定行未満を抽出

b = df[:3]
print(b)
print(b.shape)
    a   b   c   d
0  16  12  14  11
1  15  13  14  14
2  13  17  11  11
(3, 4)
  • データフレームサイズ(3,4)になった
  • データ抽出範囲は
    • 最初の行から
    • インデックス番号3未満(=2)まで

全部

c = df[:]
print(c)
print(c.shape)
    a   b   c   d
0  16  12  14  11
1  15  13  14  14
2  13  17  11  11
3  17  17  10  12
4  19  19  13  12
(5, 4)
  • 全行抽出するなら[:]はなしでもいい?
    • 「:」の意味を理解するために、覚えておきましょう
    • きっと役に立ちます

注意事項

  • この行データの取り出しはシンプルで使いやすそうに感じますが注意が必要です
  • 次のような場合に問題があります

データ作成

import numpy as np
import pandas as pd
df = pd.DataFrame({'a':[1,2,3],'b':[1,2,3],'c':[1,2,3],'d':[1,2,3]})
   a  b  c  d
0  1  1  1  1
1  2  2  2  2
2  3  3  3  3
  • ディクショナリ型を使って、普通にデータフレームを作成

問題がある例(範囲指定)

a = df[1:3]
b = df[1:100]
print(a)
print(a.shape)
print(b)
print(b.shape)
   a  b  c  d
1  2  2  2  2
2  3  3  3  3
(2, 4)
   a  b  c  d
1  2  2  2  2
2  3  3  3  3
(2, 4)
  • データ範囲の指定方法が異なります
    • aは[1:3]
    • bは[1:100]
  • データ抽出結果を見ると、
    • どちらも同じ
    • bは4以降がないので100までと言われても取り出せない(当たり前)
  • 問題とする理由
    • 指定範囲にデータがないのにエラーにならない
    • データによって返す内容が異なる
      • 10件範囲指定したつもりが、実は参照データが3件しかなかったみたいなことがあり得る

注意事項のまとめ

  • 範囲指定の場合、データにより結果が異なることがある
    • 理解して利用


Posted by futa