私の意見では、欠落している値のみのDataFrameを使用しているため、受け入れられた回答は混乱を招きます。私も長期好きではない位置ベースのため.iloc
、代わりに、好む場所整数、それははるかに記述的で、まさにとして.iloc
の略です。キーワードはINTEGERです.iloc
-INTEGERSが必要です。
詳細については、サブセットの選択に関する非常に詳細なブログシリーズを参照してください
.ixは非推奨であり、あいまいであるため、使用しないでください。
ので.ix
ISは廃止我々は唯一の間の違いに焦点を当てます.loc
と.iloc
。
違いについて説明する前に、DataFrameには各列と各インデックスの識別に役立つラベルがあることを理解することが重要です。サンプルDataFrameを見てみましょう:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
太字の単語はすべてラベルです。ラベルは、age
、color
、food
、height
、score
およびstate
のために使用されている列。他の標識は、Jane
、Nick
、Aaron
、Penelope
、Dean
、Christina
、Cornelia
のために使用されているインデックス。
DataFrameの特定の行を選択する主な方法は、.loc
および.iloc
インデクサーを使用することです。これらの各インデクサーを使用して列を同時に選択することもできますが、今のところは、行に焦点を合わせる方が簡単です。また、各インデクサーは、名前の直後に続くブラケットのセットを使用して、選択を行います。
.locはラベルによってのみデータを選択します
最初に.loc
、インデックスまたは列ラベルによってのみデータを選択するインデクサーについて説明します。サンプルのDataFrameでは、インデックスの値として意味のある名前を提供しています。多くのDataFrameには意味のある名前がなく、代わりにデフォルトで0からn-1までの整数に設定されます。nはDataFrameの長さです。
使用できる3つの異なる入力があります .loc
- 文字列
- 文字列のリスト
- 文字列を開始値および終了値として使用するスライス表記
文字列を含む.locで単一の行を選択する
1行のデータを選択するには、インデックスラベルを角かっこ内に配置します.loc
。
df.loc['Penelope']
データの行をシリーズとして返します
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
文字列のリストを含む.locで複数の行を選択する
df.loc[['Cornelia', 'Jane', 'Dean']]
これは、リストで指定された順序で行を持つDataFrameを返します。
スライス表記の.locで複数の行を選択する
スライス表記は、開始、停止、およびステップの値によって定義されます。ラベルでスライスすると、パンダは戻り値にストップ値を含めます。以下のアーロンからディーンまでのスライス。そのステップサイズは明示的に定義されていませんが、デフォルトは1です。
df.loc['Aaron':'Dean']
複雑なスライスは、Pythonリストと同じ方法で取得できます。
.ilocは整数位置のみでデータを選択します
次にに移りましょう.iloc
。DataFrameのデータのすべての行と列には、それを定義する整数の場所があります。これは、出力に視覚的に表示されるラベルに追加されます。整数の位置は、0から始まる上/左からの行/列の数です。
使用できる3つの異なる入力があります .iloc
- 整数
- 整数のリスト
- 開始値と終了値として整数を使用するスライス表記
整数の.ilocで単一の行を選択する
df.iloc[4]
これは、5行目(整数位置4)をシリーズとして返します
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
整数のリストを含む.ilocで複数の行を選択する
df.iloc[[2, -2]]
これは、3番目と2番目から最後の行のDataFrameを返します。
スライス表記の.ilocで複数の行を選択する
df.iloc[:5:3]
.locと.ilocによる行と列の同時選択
両方の優れた機能の1つ.loc/.iloc
は、行と列の両方を同時に選択できることです。上記の例では、すべての列が各選択から返されました。行と同じタイプの入力を持つ列を選択できます。行と列の選択をカンマで区切るだけです。
たとえば、JaneとDeanの行を次のように列の高さ、スコア、状態だけで選択できます。
df.loc[['Jane', 'Dean'], 'height':]
これは、行のラベルのリストと列のスライス表記を使用します
自然に.iloc
整数のみを使用して同様の操作を行うことができます。
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
ラベルと整数位置による同時選択
.ix
は、ラベルと整数の位置と同時に選択を行うために使用されましたが、これは有用でしたが、時折混乱し、あいまいでした。ラベルと整数の場所を組み合わせて選択する必要がある場合は、両方の選択ラベルまたは整数の場所を作成する必要があります。
たとえば、行Nick
とCornelia
列2および4 を選択する場合は.loc
、次のように整数をラベルに変換して使用できます。
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
または、get_loc
indexメソッドを使用して、インデックスラベルを整数に変換します。
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
ブール選択
.locインデクサーはブール選択も実行できます。たとえば、年齢が30を超えるすべての行を検索して、food
およびscore
列のみを返す場合、次のようにできます。
df.loc[df['age'] > 30, ['food', 'score']]
これを複製することはでき.iloc
ますが、ブールシリーズを渡すことはできません。次のように、ブールSeriesをnumpy配列に変換する必要があります。
df.iloc[(df['age'] > 30).values, [2, 4]]
すべての行を選択する
.loc/.iloc
列の選択だけに使用できます。次のようにコロンを使用して、すべての行を選択できます。
df.loc[:, 'color':'score':2]
インデックス付け演算子は[]
、行と列も選択できますが、同時に選択することはできません。
ほとんどの人は、列を選択することであるDataFrameインデックス演算子の主な目的に精通しています。文字列は1つの列をシリーズとして選択し、文字列のリストは複数の列をデータフレームとして選択します。
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
リストを使用すると複数の列が選択されます
df[['food', 'score']]
あまり知られていないのは、スライス表記を使用すると、行ラベルまたは整数の場所によって選択が行われることです。これは非常にわかりにくく、ほとんど使用しませんが、機能します。
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
.loc/.iloc
行を選択するためのの明示性は非常に優先されます。インデックス付け演算子だけでは、行と列を同時に選択することはできません。
df[3:5, 'color']
TypeError: unhashable type: 'slice'