web-dev-qa-db-ja.com

pythonの.locを使用した選択

私は誰かのiPythonノートブックでこのコードを見ましたが、このコードがどのように機能するかについて非常に混乱しています。私が理解した限りでは、pd.loc []は、形式が次の場所に基づくインデクサーとして使用されます。

df.loc[index,column_name]

ただし、この場合、最初のインデックスは一連のブール値のようです。この選択がどのように機能するかを誰かに説明してください。ドキュメントを読み通そうとしましたが、説明がわかりませんでした。ありがとう!

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

enter image description here

37
bugsyb

pd.DataFrame.locは、1つまたは2つのインデクサーを取ることができます。投稿の残りの部分では、最初のインデクサーをiとして、2番目のインデクサーをjとして表します。

1つのインデクサーのみが提供される場合、それはデータフレームのインデックスに適用され、欠落しているインデクサーはすべての列を表すと見なされます。したがって、次の2つの例は同等です。

  1. df.loc[i]
  2. df.loc[i, :]

:は、すべての列を表すために使用されます。

両方のインデクサーが存在する場合、iはインデックス値を参照し、jは列値を参照します。


これで、iおよびjが想定できる値のタイプに集中できます。次のデータフレームdfを例として使用してみましょう。

    df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y'])

locは、iおよびjができるように記述されています

  1. スカラーこれは、それぞれのインデックスオブジェクトの値である必要があります

    df.loc['A', 'Y']
    
    2
    
  2. arrays要素はそれぞれのインデックスオブジェクトのメンバーでもあります(locに渡す配列の順序が尊重されることに注意してください)

    df.loc[['B', 'A'], 'X']
    
    B    3
    A    1
    Name: X, dtype: int64
    
    • 配列を渡すときの戻りオブジェクトの次元に注意してください。 iは上記の配列です。locは、これらの値を持つインデックスが返されるオブジェクトを返します。この場合、jはスカラーであったため、locpd.Seriesオブジェクトを返しました。 iおよびjの配列を渡した場合、これを操作してデータフレームを返すことができ、その配列は単一の値の配列であったかもしれません。

      df.loc[['B', 'A'], ['X']]
      
         X
      B  3
      A  1
      
  3. ブール配列要素はTrueまたはFalseで、長さはそれぞれのインデックスの長さと一致します。この場合、locは、ブール配列がTrueである行(または列)を単に取得します。

    df.loc[[True, False], ['X']]
    
       X
    A  1
    

locに渡すことができるインデクサーに加えて、割り当てを行うこともできます。これで、指定したコード行を分解できます。

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
  1. iris_data['class'] == 'versicolor'はブール配列を返します。
  2. classは、columnsオブジェクトの値を表すスカラーです。
  3. iris_data.loc[iris_data['class'] == 'versicolor', 'class']は、pd.Series'class'であるすべての行の'class'列で構成される'versicolor'オブジェクトを返します
  4. 代入演算子とともに使用する場合:

    iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
    

    'Iris-versicolor''class'であった列'class'のすべての要素に'versicolor'を割り当てます

71
piRSquared

これは、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'
5
LangeHaare

それはpandasデータフレームであり、df.locでラベルベース選択ツールを使用しており、その中に行用と列用の2つの入力があるため、行入力で選択しています列 'class'に保存された値が 'versicolor'であり、列入力でラベル 'class'の列を選択し、それらに 'Iris-versicolor'値を割り当てる行値。したがって、基本的には、列 'class'のすべてのセルを値 'versicolor'で 'Iris-versicolor'に置き換えます。

3
Aashish Kumar

ここで説明されているように、pandasラベルベースの選択です。 https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label

ブール配列は、基本的にマスクを使用した選択方法です。

0
Def_Os