【Pandas】行を指定して取得[Python]

  • URLをコピーしました!
目次

データ解析支援ライブラリPandas

前回、データ解析支援ライブラリPandasを使って、CSVファイルの読み込み方法を解説しました。

今回は読み込んだデータを表示する方法を解説していきます。

まずは前回のおさらいから。

使用するデータは、自作のダミーデータ作成プログラムで作ったこちら。

今回は「dataname」の列をインデックス名として用いたいので、こんな感じでデータを読み込んでおきます。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df

実行結果

自分が勉強してみて一番最初につまづいたのが、行とか列の取得方法です。

その理由としては、取得方法が色々ありすぎるから。

ということで3PySciでは自分が後で見て分かるように解説していきたいと思います。

行、列を一度に解説すると結構ごちゃごちゃしてしまうので、まずは行から解説していきます。

リスト形式で行を取得する方法

多分一番分かりやすいのは、今まで使ってきたリスト形式で行を指定する方法でしょう。

つまりこんな感じです。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df[0:5]

実行結果

ここで気をつけて欲しいのは、df[X:Y]でXは含み、Yは含まないということです。

今回の場合インデックスとして0(つまり1行目)を含み、インデックスとして5(つまり6行目)は含まないということです。

リストのインデックス指定方法と同じということで、こんなことも可能です。

df[:3]で「最初からインデックス2まで」という指定

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df[:3]

実行結果

df[7:]でインデックス7から最後までという指定

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df[7:]

実行結果

df[3:-4] で前からのインデックス3と後ろからのインデックス4までという指定

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df[3:-4]

実行結果

ただここで注意したいのは、1行だけでは指定できないということ。

つまりdf[X]は使えません。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df[5]

実行結果
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2896             try:
-> 2897                 return self._engine.get_loc(key)
   2898             except KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 5
(以下略)

1行だけ指定する方法は後ほど解説します。

リスト形式で「インデックス名」を使って取得する方法

通常リスト形式で要素を取得するには、先ほどのようにインデックス番号を使って要素を取得します。

しかしPandasの特徴として、インデックス名を使ってもリスト形式で要素を取得することができます。

ということでこんな感じ。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df["data_1":"data_5"]

実行結果

先ほどのように「最初からインデックスXまで」とか「インデックスXから最後まで」といった取得方法もできますが、今回は割愛します。

そしてこのインデックス名を使って要素を取得する方法でも、1行だけ指定するということはできません。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df["data_1"]

実行結果
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2896             try:
-> 2897                 return self._engine.get_loc(key)
   2898             except KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'data_1'
(以下略)

1行だけ指定する方法:.iloc[インデックス]と.loc[インデックス名]

しかし1行だけ指定したいという時もあることでしょう。

その場合は、.iloc、または.locというコマンドを使います。

何故二つあるかというと、.ilocは「インデックス」を指定して行を取得する場合、.locは「インデックス名」を指定して行を取得する場合に用います。

.iloc[インデックス]の場合

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.iloc[1]

実行結果
value_1    14
value_2    79
value_3    53
value_4     1
value_5    47
Name: data_2, dtype: int64

.loc[“インデックス名”]の場合

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.loc["data_2"]

実行結果
value_1    14
value_2    79
value_3    53
value_4     1
value_5    47
Name: data_2, dtype: int64

ただしこの場合は表形式ではなく、リストと辞書として取得されます。

つまりさらに次のインデックスを指定すると、今度は列を指定できるというわけです。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.iloc[1][2]

実行結果
53

この場合では最初にインデックス2の要素、つまり「data_2の行」を取得し、次にその中のインデックス2の要素、つまり「value_3」の要素を取得したというわけです。

この場合にもヘッダー名を指定して、列の要素を取得することもできます。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.iloc[1]["value_3"]

実行結果
53

もちろんiloc関数だけでなく、loc関数でも同じです。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.loc["data_2"]["value_3"]

実行結果
53

iloc、loc関数を使って、連続した複数行を取得する方法

iloc関数、またloc関数を使って、複数行を取得することもできます。

ただしその際、少し制限があるので注意が必要です。

とりあえず取得方法を先に解説しましょう。

インデックスを使用して複数行を取得するには、.iloc[インデックス1:インデックス2]とします。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.iloc[1:4]

実行結果

次にインデックス名を使用して、複数行を取得するには、.loc[“インデックス名1″;”インデックス名2”]とします。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.loc["data_1":"data_4"]

実行結果

制限というのは、あくまでも連続した複数行しか取得できないということです。

つまり.iloc[インデックス1,インデックス2]や.loc[“インデックス名1″,”インデックス名2”]は使えないということです。

試してみましょう。

.iloc[インデックス1,インデックス2]の場合

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.iloc[1,4]

実行結果
47

この場合は、.iloc[“インデックス”, “カラム”]と認識されてしまい、上の例では1行目、4列目のデータが表示されることになります。

.loc[“インデックス名1″,”インデックス名2”]

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.loc["data_2","data_4"]

実行結果
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2896             try:
-> 2897                 return self._engine.get_loc(key)
   2898             except KeyError:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'data_4'
(以下略)

.iloc[“インデックス”, “カラム”]だったように、.loc[“インデックス名”, “列名”]と認識され、上記の場合は「data_4」 というカラム名がないため、エラーとなります。

試しに存在するカラム名を指定してみましょう。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.loc["data_2","value_5"]

実行結果
47

確かに一つの値が表示され、.loc[“インデックス名”, “列名”]と認識されていることが分かります。

iloc、loc関数を使って、連続しない複数行を取得する方法

では連続していない複数行を取得したかったらどうしたらいいでしょうか。

その場合は.iloc[[インデックス1,インデックス2]]や.loc[[“インデックス名1″,”インデックス名2”]]とします。

.iloc[インデックス,列]や.loc[“インデックス名”,”列名”]となってしまうため、.iloc[[インデックス1, インデックス2],列]や.loc[[“インデックス名1″,”インデックス名2″],”列名”]とするというわけです。

ただし全部の列を指定する場合、列や”列名”は省略できるため、.iloc[[インデックス1,インデックス2]]や.loc[[“インデックス名1″,”インデックス名2”]]となるというわけです。

試してみましょう。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.iloc[[1, 5]]

実行結果
import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.loc[["data_2", "data_6"]]

連続していない複数行を取得することができました。

データの最初からX行を取得:head()

データを確認するのに全部見るのは大変ですが、上からとか下からちょっと見るなんてこともできます、

データの上から何行かを取得するのには、head()を用います。

例えば最初から5行を取得するにはdf.head(5)とします。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.head(5)

実行結果

データの最後からX行を取得:tail()

逆にデータの最後から何行か取得するには、tail()を使います。

import pandas as pd

df = pd.read_csv("python-pandas-2_data.txt", index_col=0)

df.tail(5)

実行結果

ということで今回はPandasを使った時の行の取得の方法を解説してみました。

これだけ何種類もあると、なかなか覚えるのも大変ですが、基本的にリストと同じだと覚えておけば、最低限大丈夫かなと感じました。

あとは使っていくうちに覚えていくことでしょう。

次回は列を取得する方法を解説していきます。

ということで今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次