データ解析支援ライブラリPandas
前回はデータ解析支援ライブラリPandasで列を指定してデータを取得する方法を解説しました。

行も列も取得する方法が色々あって、なかなかややこしいですが、今回はさらにややこしい行と列の両方を指定してデータを取得する方法を解説していきたいと思います。
今回もまずは準備から進めていきましょう。
使用するデータは、自作のダミーデータ作成プログラムで作ったこちら。

データの読み込みはこんな感じです。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df
実行結果

今回はなかなかややこしいので、先にやることをリスト化してみます。
- 行:連続した複数、列:連続した複数
- 行:連続した複数、列:連続しない複数
- 行:連続しない複数、列:連続した複数
- 行:連続しない複数、列:連続しない複数
重要なのは取得するデータが連続しているか、していないかということです。
またそれぞれに行数(インデックス)や列数(カラム)で指定する場合と名前で指定する場合があります。
少しずつ解説していきましょう。
連続した複数行、連続した複数列を取得する方法
まずは行も列も連続している場合で、行数や列数で指定する場合です。
この場合は.iloc[行数1:行数2, 列数1:列数2]と指定します。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[1:3, 2:5]
実行結果

行名や列名で指定する場合は、.loc[行名1:行名2, 列名1:列名2]とします。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.loc["data_2":"data_3", "value_3":"value_5"]
実行結果

どちらの場合も、行数や列数と行名や列名を混ぜて指定することはできません。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[1:3, "value_3":"value_5"]
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-171-b733f8541a46> in <module>
3 df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
4
----> 5 df.iloc[1:3, "value_3":"value_5"]
(以下略)
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.loc[1:3, "value_3":"value_5"]
実行結果
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-176-9cd6ed5894ad> in <module>
3 df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
4
----> 5 df.loc[1:3, "value_3":"value_5"]
(以下略)
連続した複数行、連続しない複数列を取得する方法
次は行は連続していて、列は連続していない場合です。
この場合で列数、行数で指定するには.iloc[行数1:行数2, [列数1, 列数2…]]とします。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[0:3, [0,2,4]]
実行結果

名前で指定する場合は、.loc[行名1:行名2, [列名1, 列名2…]]となります。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.loc["data_1":"data_3", ["value_1", "value_3", "value_5"]]
実行結果

連続しない複数行、連続した複数列を取得する方法
次は行は連続していなくて、列は連続している場合です。
行数、列数で取得する場合は、iloc[[行数1, 行数2…], 列数1:列数2]となります。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[[0, 2, 4], 2:5]
実行結果

そして行名、列名で取得する場合は、.loc[[行名1, 行名2…], 列名1:列名2]です。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.loc[["data_1", "data_3", "data_4"], "value_3":"value_5"]
実行結果

連続しない複数行、連続しない複数列を取得する方法
ということで最後に行も列も連続しない箇所を指定して取得する方法です。
この場合を行数、列数で取得する場合は、iloc[[行数1, 行数2…], [列数1, 列数2…]]となります。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[[0, 3, 6], [0, 2, 4]]
実行結果

行名、列名で取得する場合は、.loc[[行名1, 行名2…], [列名1, 列名2…]]となります。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.loc[["data_1", "data_4", "data_7"], ["value_1", "value_3", "value_5"]]
実行結果

最後にややこしい例を紹介
ここまででPandasで行や列を指定してデータを取得する方法は理解が進んできたと思います。
というよりも私自身の理解が進みました。
でもせっかくなので最後にその理解を壊して、また分からなくする例を紹介したいと思います。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[2:5]["value_2"]
実行結果
dataname
data_3 20
data_4 33
data_5 41
Name: value_2, dtype: int64
行数や列数を指定してデータを取得する.ilocですが、何故か最後に[“value_2”] と列名で指定しているにも関わらず、ちゃんと処理できています。
では列名は複数指定できるのでしょうか?
まずは連続した列名にしてみます。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[2:5]["value_2":"value_4"]
実行結果

エラーは出なかったものの、思ったような処理にはなっていません。
では次に連続していない場合です。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[2:5]["value_2", "value_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: ('value_2', 'value_4')
(以下略)
こちらはエラーになりました。
ちなみに列名ではなく、列数では指定できるのでしょうか?
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[2:5][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: 1
(以下略)
.ilocに列数で指定したのに、エラーとなってしまいました。
なんでこうなるか考えてみましょう。
df.iloc[2:5][“value_2”]のみ処理が成功しています。
多分、df.iloc[2:5]までで新しいテーブルができていて、それに対して前回説明した1つの列を取得するdf[“列名”]という処理がされているのでしょう。

その証拠に「df.iloc[2:5].value_2」という指定方法も可能です。
import pandas as pd
df = pd.read_csv("python-pandas-2_data.txt", index_col=0)
df.iloc[2:5].value_2
実行結果
dataname
data_3 20
data_4 33
data_5 41
Name: value_2, dtype: int64
一応紹介してみましたが、個人的には列数や行数と列名、行名が混ぜこぜになってしまい、分かりにくいので使用しないと思います。
基本的には、
- .iloc[行数, 列数]
- .loc[行名, 列名]
そして両方ともリストと同じ指定方法が可能、つまり
- [X, Y, Z]でX、Y、Zを取得
- [X:]でX以降最後まで取得
- [:Y]で最初からYまで取得(ilocではYを含まず、locではYを含む)
- [X:Y]でXからYまで取得(ilocではYを含まず、locではYを含む)
ということを覚えておけばいいのかなと思っています。
何とかデータの取得方法が分かったところで、次回は列名や行名、また列数や行数を取得する方法を解説していきたいと思います。

ということで今回はこんな感じで。
コメント