pandasのiloc使用法
Pythonにおけるデータ解析支援機能を提供するpandasのiloc使用法についてご紹介します。
pandasのilocは、csvデータ読み込み後、必要データを抽出するのに便利です。
目次
条件
- Python 3.7.0
- pandas 0.25.3
ilocとは
ilocは、DataFrameやSeriesから指定したインデックスのデータを抽出することが出来ます。
主に整数で位置を指定しますが、boolean配列を用いた指定方法もあります。
サンプルデータ
日経平均株価の時系列データをサンプルとして扱います。
当該データは、nikkei.csvというCSVファイルに保存されているものとします。
(csvファイルのエンコードはSJISであるものとします。)
日付,始値,高値,安値,終値 2019年11月5日,23118.79,23328.52,23090.94,23251.99 2019年11月1日,22730.49,22852.72,22705.6,22850.77 2019年10月31日,22910.1,22988.8,22875.5,22927.04 2019年10月30日,22953.17,22961.23,22827.93,22843.12 2019年10月29日,22950.79,23008.43,22935.35,22974.13 2019年10月28日,22854.44,22896.22,22830.57,22867.27 2019年10月25日,22753.24,22819.92,22715.13,22799.81 2019年10月24日,22725.44,22780.99,22704.33,22750.6 2019年10月23日,22619.77,22648.81,22457.89,22625.38 2019年10月21日,22541.22,22581.28,22515.73,22548.9 2019年10月18日,22528.56,22649.85,22466.26,22492.68 2019年10月17日,22451.15,22522.39,22424.92,22451.86 2019年10月16日,22479.57,22615.47,22434.35,22472.92 2019年10月15日,22063.71,22219.63,22049.71,22207.21 2019年10月11日,21749.93,21820.77,21658.27,21798.87 2019年10月10日,21456.27,21601.46,21308.88,21551.98 2019年10月9日,21359.84,21467.77,21359.84,21456.38 2019年10月8日,21494.48,21629.24,21483.18,21587.78 2019年10月7日,21445.73,21475.28,21328.26,21375.25 2019年10月4日,21316.18,21410.2,21276.01,21410.2
サンプルプログラム
csvファイル読み込み
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df)
実行結果
csvデータ全体が出力されます。
日付 始値 高値 安値 終値 0 2019年11月5日 23118.79 23328.52 23090.94 23251.99 1 2019年11月1日 22730.49 22852.72 22705.60 22850.77 2 2019年10月31日 22910.10 22988.80 22875.50 22927.04 3 2019年10月30日 22953.17 22961.23 22827.93 22843.12 4 2019年10月29日 22950.79 23008.43 22935.35 22974.13 5 2019年10月28日 22854.44 22896.22 22830.57 22867.27 6 2019年10月25日 22753.24 22819.92 22715.13 22799.81 7 2019年10月24日 22725.44 22780.99 22704.33 22750.60 8 2019年10月23日 22619.77 22648.81 22457.89 22625.38 9 2019年10月21日 22541.22 22581.28 22515.73 22548.90 10 2019年10月18日 22528.56 22649.85 22466.26 22492.68 11 2019年10月17日 22451.15 22522.39 22424.92 22451.86 12 2019年10月16日 22479.57 22615.47 22434.35 22472.92 13 2019年10月15日 22063.71 22219.63 22049.71 22207.21 14 2019年10月11日 21749.93 21820.77 21658.27 21798.87 15 2019年10月10日 21456.27 21601.46 21308.88 21551.98 16 2019年10月9日 21359.84 21467.77 21359.84 21456.38 17 2019年10月8日 21494.48 21629.24 21483.18 21587.78 18 2019年10月7日 21445.73 21475.28 21328.26 21375.25 19 2019年10月4日 21316.18 21410.20 21276.01 21410.20
整数での位置指定
ソース
df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[2])
実行結果
ヘッダーと共に、指定した数値の行(ヘッダーを除いて0から開始)が抽出されます。
日付 2019年10月31日 始値 22910.1 高値 22988.8 安値 22875.5 終値 22927 Name: 2, dtype: object
整数リストでの位置指定
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[[0, 3]])
実行結果
ヘッダーと共に、リストで指定した数値の行(ヘッダーを除いて0から開始)が抽出されます。
ここでは、リストで0および3を指定したため、0および3の行が抽出されています。
日付 始値 高値 安値 終値 0 2019年11月5日 23118.79 23328.52 23090.94 23251.99 3 2019年10月30日 22953.17 22961.23 22827.93 22843.12
整数リストでの位置指定(スライス)
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[:5])
実行結果
スライス(0~4の5行)指定でもデータを抽出することが出来ます。
日付 始値 高値 安値 終値 0 2019年11月5日 23118.79 23328.52 23090.94 23251.99 1 2019年11月1日 22730.49 22852.72 22705.60 22850.77 2 2019年10月31日 22910.10 22988.80 22875.50 22927.04 3 2019年10月30日 22953.17 22961.23 22827.93 22843.12 4 2019年10月29日 22950.79 23008.43 22935.35 22974.13
booleanリストでの位置指定
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[[True, False, True, False, False, False, False, False, False, False , False, False, False, False, False, False, False, False, False, True]])
実行結果
Trueが指定された行のみが抽出されていることがわかります。
日付 始値 高値 安値 終値 0 2019年11月5日 23118.79 23328.52 23090.94 23251.99 2 2019年10月31日 22910.10 22988.80 22875.50 22927.04 19 2019年10月4日 21316.18 21410.20 21276.01 21410.20
booleanリストでの位置指定(lambda)
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[lambda x: x.index % 2 == 1])
実行結果
lambdaを使用すると、奇数行のみの抽出も簡単にできます。
日付 始値 高値 安値 終値 1 2019年11月1日 22730.49 22852.72 22705.60 22850.77 3 2019年10月30日 22953.17 22961.23 22827.93 22843.12 5 2019年10月28日 22854.44 22896.22 22830.57 22867.27 7 2019年10月24日 22725.44 22780.99 22704.33 22750.60 9 2019年10月21日 22541.22 22581.28 22515.73 22548.90 11 2019年10月17日 22451.15 22522.39 22424.92 22451.86 13 2019年10月15日 22063.71 22219.63 22049.71 22207.21 15 2019年10月10日 21456.27 21601.46 21308.88 21551.98 17 2019年10月8日 21494.48 21629.24 21483.18 21587.78 19 2019年10月4日 21316.18 21410.20 21276.01 21410.20
スライスで行と列指定
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[1:5, 0:4])
実行結果
スライスで指定した範囲の値を抽出することが出来ます。
- 行:1:5 ⇒ 1~4行
- 列:0:4 ⇒ 0~3列
日付 始値 高値 安値 1 2019年11月1日 22730.49 22852.72 22705.60 2 2019年10月31日 22910.10 22988.80 22875.50 3 2019年10月30日 22953.17 22961.23 22827.93 4 2019年10月29日 22950.79 23008.43 22935.35
スライスを用いて列指定
ソース
import pandas as pd df = pd.read_csv('nikkei.csv', encoding="shift_jis") # csvファイル読み込み print(df.iloc[:, 4])
実行結果
指定した列(0から開始して4)のみ抽出することが出来ます。
0 23251.99 1 22850.77 2 22927.04 3 22843.12 4 22974.13 5 22867.27 6 22799.81 7 22750.60 8 22625.38 9 22548.90 10 22492.68 11 22451.86 12 22472.92 13 22207.21 14 21798.87 15 21551.98 16 21456.38 17 21587.78 18 21375.25 19 21410.20 Name: 終値, dtype: float64
参考
pandas.DataFrame.iloc
Qiita:Pythonのlambdaって分かりやすい
https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df