私は誰かのiPythonノートブックでこのコードを見ましたが、このコードがどのように機能するかについて非常に混乱しています。私が理解した限りでは、pd.loc []は、形式が次の場所に基づくインデクサーとして使用されます。
df.loc[index,column_name]
ただし、この場合、最初のインデックスは一連のブール値のようです。この選択がどのように機能するかを誰かに説明してください。ドキュメントを読み通そうとしましたが、説明がわかりませんでした。ありがとう!
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
pd.DataFrame.loc
は、1つまたは2つのインデクサーを取ることができます。投稿の残りの部分では、最初のインデクサーをi
として、2番目のインデクサーをj
として表します。
1つのインデクサーのみが提供される場合、それはデータフレームのインデックスに適用され、欠落しているインデクサーはすべての列を表すと見なされます。したがって、次の2つの例は同等です。
df.loc[i]
df.loc[i, :]
:
は、すべての列を表すために使用されます。
両方のインデクサーが存在する場合、i
はインデックス値を参照し、j
は列値を参照します。
これで、i
およびj
が想定できる値のタイプに集中できます。次のデータフレームdf
を例として使用してみましょう。
df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y'])
loc
は、i
およびj
ができるように記述されています
スカラーこれは、それぞれのインデックスオブジェクトの値である必要があります
df.loc['A', 'Y']
2
arrays要素はそれぞれのインデックスオブジェクトのメンバーでもあります(loc
に渡す配列の順序が尊重されることに注意してください)
df.loc[['B', 'A'], 'X']
B 3
A 1
Name: X, dtype: int64
配列を渡すときの戻りオブジェクトの次元に注意してください。 i
は上記の配列です。loc
は、これらの値を持つインデックスが返されるオブジェクトを返します。この場合、j
はスカラーであったため、loc
はpd.Series
オブジェクトを返しました。 i
およびj
の配列を渡した場合、これを操作してデータフレームを返すことができ、その配列は単一の値の配列であったかもしれません。
df.loc[['B', 'A'], ['X']]
X
B 3
A 1
ブール配列要素はTrue
またはFalse
で、長さはそれぞれのインデックスの長さと一致します。この場合、loc
は、ブール配列がTrue
である行(または列)を単に取得します。
df.loc[[True, False], ['X']]
X
A 1
loc
に渡すことができるインデクサーに加えて、割り当てを行うこともできます。これで、指定したコード行を分解できます。
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
iris_data['class'] == 'versicolor'
はブール配列を返します。class
は、columnsオブジェクトの値を表すスカラーです。iris_data.loc[iris_data['class'] == 'versicolor', 'class']
は、pd.Series
が'class'
であるすべての行の'class'
列で構成される'versicolor'
オブジェクトを返します代入演算子とともに使用する場合:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
'Iris-versicolor'
が'class'
であった列'class'
のすべての要素に'versicolor'
を割り当てます
これは、pandas
パッケージのデータフレームを使用しています。 「インデックス」部分は、単一のインデックス、インデックスのリスト、またはブール値のリストのいずれかです。これはドキュメントで読むことができます: https://pandas.pydata.org/pandas-docs/stable/indexing.html
したがって、index
部分は取り出す行のサブセットを指定し、(オプション)column_name
はデータフレームのそのサブセットから操作したい列を指定します。したがって、「class」列を更新するが、クラスが現在「versicolor」として設定されている行のみを更新したい場合は、質問にリストしたようなことを行うことができます。
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
それはpandasデータフレームであり、df.locでラベルベース選択ツールを使用しており、その中に行用と列用の2つの入力があるため、行入力で選択しています列 'class'に保存された値が 'versicolor'であり、列入力でラベル 'class'の列を選択し、それらに 'Iris-versicolor'値を割り当てる行値。したがって、基本的には、列 'class'のすべてのセルを値 'versicolor'で 'Iris-versicolor'に置き換えます。
ここで説明されているように、pandas
ラベルベースの選択です。 https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label
ブール配列は、基本的にマスクを使用した選択方法です。