English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Pandasインデックスとデータクエリの操作例
本章では、日付のスライスやクッキングを行い、Pandasオブジェクトのサブセットを取得する方法について説明します。
PythonおよびNumPyのインデックス演算子「[]」と属性演算子「.」。Pandasデータ構造へのアクセスをさまざまな用例で迅速かつ簡単に行うことができますが、アクセスするデータのタイプが事前にわからないため、標準演算子を使用するといくつかの最適化制限が発生します。生産コードでは、本章で紹介された最適化されたPandasデータアクセスメソッドを利用することをお勧めします。
Pandasは現在、以下の3種類の多軸インデックスをサポートしています:下表に示される3種類のインデックスが挙げられます-
インデックス | 説明 |
.loc() | タグに基づいて |
.iloc() | 整数に基づいて |
.ix() | タグと整数に基づいて |
Pandasはタグベースのインデックスを完全にサポートしています。スライス時には、開始境界も含まれます。整数は有効なタグですが、位置ではなくタグを参照しています。
.loc() さまざまなアクセスメソッドを持っています。例えば:
一つのスカラータグ タグリスト スライスオブジェクト ブール配列
loc 二つの単/リスト/範囲演算子は「,」で区切られます。最初の指示行、次の指示列です。
# pandasライブラリをインポートし、別名pdとします import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 特定の列のすべての行を選択 print(df.loc[:,'A'])
実行結果:
a 0.391548 b -0.070649 c -0.317212 d -2.162406 e 2.202797 f 0.613709 g 1.050559 h 1.122680 名前: A, データ型: float64
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 複数の列のすべての行を選択、例えばlist[] print(df.loc[:,['A','C']])
実行結果:
A C a 0.391548 0.745623 b -0.070649 1.620406 c -0.317212 1.448365 d -2.162406 -0.873557 e 2.202797 0.528067 f 0.613709 0.286414 g 1.050559 0.216526 h 1.122680 -1.621420
# pandasライブラリをインポートし、別名pdとします import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 複数の列のいくつかの行を選択、例えばlist[] print(df.loc[['a','b','f','h'],['A','C']])
実行結果:
A C a 0.391548 0.745623 b -0.070649 1.620406 f 0.613709 0.286414 h 1.122680 -1.621420
# pandasライブラリをインポートし、別名pdとします import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # すべての列の行範囲を選択 print(df.loc['a':'h'])
実行結果:
A B C D a 0.391548 -0.224297 0.745623 0.054301 b -0.070649 -0.880130 1.620406 1.419743 c -0.317212 -1.929698 1.448365 0.616899 d -2.162406 0.614256 -0.873557 1.093958 e 2.202797 -2.315915 0.528067 0.612482 f 0.613709 -0.157674 0.286414 -0.500517 g 1.050559 -2.272099 0.216526 0.928449 h 1.122680 0.324368 -1.621420 -0.741470
# pandasライブラリをインポートし、別名pdとします import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), index = ['a','b','c','d','e','f','g','h'], columns = ['A', 'B', 'C', 'D']) # 布尔配列を使用して値を取得するためのもの print(df.loc['a'] > 0)
実行結果:
A False B True C False D False Name: a, dtype: bool
Pandasは、PythonやNumPyと同様に、0ベースのインデックスを提供して、純粋に整数ベースのインデックスを取得するためのさまざまな方法を提供しています。
さまざまなアクセス方法は以下の通りです:
整数 整数リスト 値範囲
# pandasライブラリをインポートし、別名pdとします import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) # 特定の列のすべての行を選択 print(df.iloc[:4)
実行結果:
A B C D 0 0.699435 0.256239 -1.270702 -0.645195 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 3 0.539042 -1.284314 0.826977 -0.026251
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) # 整数スライス print(df.iloc[:4] print(df.iloc[1:5, 2:4)
実行結果:
A B C D 0 0.699435 0.256239 -1.270702 -0.645195 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 3 0.539042 -1.284314 0.826977 -0.026251 C D 1 -0.813012 0.631615 2 0.025070 0.230806 3 0.826977 -0.026251 4 1.423332 1.130568
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) # 値リストのスライス print(df.iloc[[1, 3, 5], [1, 3] print(df.iloc[1:3, :]) print(df.iloc[:,1:3)
実行結果:
B D 1 0.890791 0.631615 3 -1.284314 -0.026251 5 -0.512888 -0.518930 A B C D 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 B C 0 0.256239 -1.270702 1 0.890791 -0.813012 2 -0.531378 0.025070 3 -1.284314 0.826977 4 -0.460729 1.423332 5 -0.512888 0.581409 6 -1.204853 0.098060 7 -0.947857 0.641358
標準のタグベースと整数ベースの方法に加えて、Pandasは.ix()演算子を使用して選択およびサブセットオブジェクトを選択するためのハイブリッド方法を提供しています。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) # 整数スライス print(df.ix[:4)
実行結果:
A B C D 0 0.699435 0.256239 -1.270702 -0.645195 1 -0.685354 0.890791 -0.813012 0.631615 2 -0.783192 -0.531378 0.025070 0.230806 3 0.539042 -1.284314 0.826977 -0.026251
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) # インデックススライス print(df.ix[:, 'A'])
実行結果:
0 0.699435 1 -0.685354 2 -0.783192 3 0.539042 4 -1.044209 5 -1.415411 6 1.062095 7 0.994204 名前: A, データ型: float64
Pandasオブジェクトから値を取得する際の多軸インデックスの使用方法は以下のシンボルで示されます:
オブジェクト | インデックスエンジン | 返り値の型 |
Series | s.loc[indexer] | スカラー値 |
DataFrame | df.loc[row_index,col_index] | Series オブジェクト |
Panel | p.loc[item_index,major_index, minor_index] | p.loc[item_index,major_index, minor_index] |
.iloc()と.ix()は同じ索引オプションと返り値を適用します。
DataFrameオブジェクトに対してどのような操作を行うかを見てみましょう。基本的な索引演算子'[]'を使用します。-
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) print(df['A'])
実行結果:
0 -0.478893 1 0.391931 2 0.336825 3 -1.055102 4 -0.165218 5 -0.328641 6 0.567721 7 -0.759399 名前: A, データ型: float64
値リストを[]に渡すことで、それらの列を選択できます
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) print(df[['A','B']])
実行結果:
A B 0 -0.478893 -0.606311 1 0.391931 -0.949025 2 0.336825 0.093717 3 -1.055102 -0.012944 4 -0.165218 1.550310 5 -0.328641 -0.226363 6 0.567721 -0.312585 7 -0.759399 -0.372696
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) print(df[2:2)
実行結果:
Columns: [A, B, 'C', 'D] Index: []
属性演算子「。」を使用して列を選択することができます。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(8, 4), 列名 = ['A', 'B', 'C', 'D']) print(df.A)
実行結果:
0 -0.478893 1 0.391931 2 0.336825 3 -1.055102 4 -0.165218 5 -0.328641 6 0.567721 7 -0.759399 名前: A, データ型: float64