すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:Collection

最終更新日:Jan 07, 2025

CollectionExprは、DataFrame 2次元データセットに対するすべての操作をサポートします。 MaxComputeテーブルまたはスプレッドシートと見なすことができます。 DataFrameオブジェクトもCollectionExprオブジェクトです。 CollectionExprは、列操作、データフィルタリング、データ変換など、2次元データセットに対するさまざまな操作をサポートしています。

前提条件

次の要件が満たされていることを確認してください。

  • pyodps_irisという名前のテーブルが用意されています。 詳細については、入門の「DataFrameデータ処理」セクションをご参照ください。

  • DataFrameオブジェクトが作成されます。 詳細については、「DataFrameオブジェクトの作成」の「MaxComputeテーブルからのDataFrameオブジェクトの作成」セクションをご参照ください。

型を取得する

dtypesメソッドを使用して、CollectionExprオブジェクトのすべての列の型を取得できます。 この例では、dtypesメソッドはSchema型を返します。 次のコードは例を示しています。

print(iris.dtypes)

次の応答が返されます。

odps.Schema {
  sepallength           float64
  sepalwidth            float64
  petallength           float64
  petalwidth            float64
  name                  string
}

列の選択、追加、削除

列の選択

expr[columns] 構文を使用して、CollectionExprオブジェクトから特定の列を選択し、データセットを作成できます。 次のコードは例を示しています。

print(iris['name', 'sepallength'].head(5))

次の応答が返されます。

          name  sepallength
0  Iris-setosa          4.9
1  Iris-setosa          4.7
2  Iris-setosa          4.6
3  Iris-setosa          5.0
4  Iris-setosa          5.4
説明

必要な列が1つだけの場合は、列名の後にコンマ (,) を追加するか、iris[iris.sepallength,] またはiris[[iris.sepallength]] などの列をリストとして明示的にマークする必要があります。 それ以外の場合は、CollectionオブジェクトではなくSequenceオブジェクトが返されます。

列の削除

  • excludeメソッドを使用して、元のデータセットの特定の列を新しいデータセットから除外できます。 次のコードは例を示しています。

    print(iris.exclude('sepallength', 'petallength')[:5].head(5))

    次の応答が返されます。

       sepalwidth  petalwidth         name
    0         3.0         0.2  Iris-setosa
    1         3.2         0.2  Iris-setosa
    2         3.1         0.2  Iris-setosa
    3         3.6         0.2  Iris-setosa
    4         3.9         0.4  Iris-setosa
  • PyODPSバージョン0.7.2以降では、新しい構文を使用して、データセットから特定の列を直接除外できます。 次のコードは例を示しています。

    del iris['sepallength']
    del iris['petallength']
    print(iris[:5].head(5))

    次の応答が返されます。

       sepalwidth  petalwidth         name
    0         3.0         0.2  Iris-setosa
    1         3.2         0.2  Iris-setosa
    2         3.1         0.2  Iris-setosa
    3         3.6         0.2  Iris-setosa
    4         3.9         0.4  Iris-setosa

列の追加

  • expr[expr, new_sequence] 構文を使用して、変換された列を既存のCollectionオブジェクトに追加できます。 新しい列は、新しいCollectionオブジェクトの一部です。

    次の例では、irisテーブルのsepalwidth列の各値に1つずつ追加することで、新しい列が作成されます。 新しい列の名前がsepalwidthplus1に変更され、既存のデータセットに追加されて別のデータセットが作成されます。 次のコードは例を示しています。

    print(iris[iris, (iris.sepalwidth + 1).rename('sepalwidthplus1')].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name  \
    0          4.9         3.0          1.4         0.2  Iris-setosa   
    1          4.7         3.2          1.3         0.2  Iris-setosa   
    2          4.6         3.1          1.5         0.2  Iris-setosa   
    3          5.0         3.6          1.4         0.2  Iris-setosa   
    4          5.4         3.9          1.7         0.4  Iris-setosa   
    
       sepalwidthplus1  
    0              4.0  
    1              4.2  
    2              4.1  
    3              4.6  
    4              4.9  
  • expr[expr, new_sequence] 構文を使用する場合、変換された列は元の列と同じ名前になる可能性があります。 元のCollectionオブジェクトとマージする場合は、新しい列の名前を変更します。 PyODPSバージョン0.7.2以降では、現在のデータセットに列を直接追加できます。 次のコードは例を示しています。

    iris['sepalwidthplus1'] = iris.sepalwidth + 1
    print(iris.head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name  \
    0          4.9         3.0          1.4         0.2  Iris-setosa   
    1          4.7         3.2          1.3         0.2  Iris-setosa   
    2          4.6         3.1          1.5         0.2  Iris-setosa   
    3          5.0         3.6          1.4         0.2  Iris-setosa   
    4          5.4         3.9          1.7         0.4  Iris-setosa  
    
       sepalwidthplus1  
    0              4.0  
    1              4.2  
    2              4.1  
    3              4.6  
    4              4.9 

列の同時追加と削除

  • excludeメソッドを使用して、元の列を除外し、新しい列をデータセットに追加できます。 この方法では、新しい列の名前を変更する必要はありません。 次のコードは例を示しています。

    print(iris[iris.exclude('sepalwidth'), iris.sepalwidth * 2].head(5))

    次の応答が返されます。

       sepallength  petallength  petalwidth         name  sepalwidth
    0          4.9          1.4         0.2  Iris-setosa         6.0
    1          4.7          1.3         0.2  Iris-setosa         6.4
    2          4.6          1.5         0.2  Iris-setosa         6.2
    3          5.0          1.4         0.2  Iris-setosa         7.2
    4          5.4          1.7         0.4  Iris-setosa         7.8
  • PyODPSバージョン0.7.2以降では、新しい列を直接使用して、現在のデータセットの元の列を上書きできます。 次のコードは例を示しています。

    iris['sepalwidth'] = iris.sepalwidth * 2
    print(iris.head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          4.9         6.0          1.4         0.2  Iris-setosa
    1          4.7         6.4          1.3         0.2  Iris-setosa
    2          4.6         6.2          1.5         0.2  Iris-setosa
    3          5.0         7.2          1.4         0.2  Iris-setosa
    4          5.4         7.8          1.7         0.4  Iris-setosa
  • 列を同時に追加および削除するには、selectメソッドを呼び出してCollectionオブジェクトを作成することもできます。 このような操作を実行するには、選択した列を入力パラメータとして使用する必要があります。 keywordパラメーターを使用して、列の名前を変更できます。 次のコードは例を示しています。

    print(iris.select('name', sepalwidthminus1=iris.sepalwidth - 1).head(5))

    次の応答が返されます。

              name  sepalwidthminus1
    0  Iris-setosa               2.0
    1  Iris-setosa               2.2
    2  Iris-setosa               2.1
    3  Iris-setosa               2.6
    4  Iris-setosa               2.9
  • 前の操作の結果をパラメーターとして受け取るラムダ式を渡すこともできます。 実行中、PyODPSはラムダ式をチェックし、前の操作から生成されたCollectionオブジェクトを渡し、有効な列に置き換えます。 次のコードは例を示しています。

    print(iris['name', 'petallength'][[lambda x: x.name]].head(5))

    次の応答が返されます。

              name
    0  Iris-setosa
    1  Iris-setosa
    2  Iris-setosa
    3  Iris-setosa
    4  Iris-setosa
  • PyODPSバージョン0.7.2以降では、条件付き割り当てがサポートされています。 次のコードは例を示しています。

    iris[iris.sepallength > 5.0, 'sepalwidth'] = iris.sepalwidth * 2
    print(iris.head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          4.9         3.0          1.4         0.2  Iris-setosa
    1          4.7         3.2          1.3         0.2  Iris-setosa
    2          4.6         3.1          1.5         0.2  Iris-setosa
    3          5.0         3.6          1.4         0.2  Iris-setosa
    4          5.4         7.8          1.7         0.4  Iris-setosa

定数と乱数を導入する

定数の導入

  • DataFrameを使用すると、Collectionオブジェクトに定数の列を追加できます。

    定数を導入するにはスカラーが必要です。 定数を導入するには、手動で列名を指定する必要があります。 次のコードは例を示しています。

    from odps.df import Scalar
    print(iris[iris, Scalar(1).rename('id')][:5].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name  id
    0          4.9         3.0          1.4         0.2  Iris-setosa   1
    1          4.7         3.2          1.3         0.2  Iris-setosa   1
    2          4.6         3.1          1.5         0.2  Iris-setosa   1
    3          5.0         3.6          1.4         0.2  Iris-setosa   1
    4          5.4         3.9          1.7         0.4  Iris-setosa   1
  • あなたが使用

    NullScalarを使用してnull列を指定します。 この場合、フィールドタイプを指定する必要があります。 次のコードは例を示しています。

    from odps.df import NullScalar
    print(iris[iris, NullScalar('float').rename('fid')][:5].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name   fid
    0          4.9         3.0          1.4         0.2  Iris-setosa  None
    1          4.7         3.2          1.3         0.2  Iris-setosa  None
    2          4.6         3.1          1.5         0.2  Iris-setosa  None
    3          5.0         3.6          1.4         0.2  Iris-setosa  None
    4          5.4         3.9          1.7         0.4  Iris-setosa  None
  • PyODPSバージョン0.7.12以降では、より単純な構文が提供されます。 次のコードは例を示しています。

    iris['id'] = 1
    print(iris.head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name  id
    0          4.9         3.0          1.4         0.2  Iris-setosa   1
    1          4.7         3.2          1.3         0.2  Iris-setosa   1
    2          4.6         3.1          1.5         0.2  Iris-setosa   1
    3          5.0         3.6          1.4         0.2  Iris-setosa   1
    4          5.4         3.9          1.7         0.4  Iris-setosa   1

    構文を使用すると、null値の型は自動的に識別できません。 したがって、次のコードを使用してnull列を追加する必要があります。

    iris['null_col'] = NullScalar('float')
    print(iris.head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name null_col
    0          4.9         3.0          1.4         0.2  Iris-setosa     None
    1          4.7         3.2          1.3         0.2  Iris-setosa     None
    2          4.6         3.1          1.5         0.2  Iris-setosa     None
    3          5.0         3.6          1.4         0.2  Iris-setosa     None
    4          5.4         3.9          1.7         0.4  Iris-setosa     None

乱数の導入

DataFrameでは、Collectionオブジェクトに乱数の列を追加することもできます。 列タイプはFLOATで、値の範囲は0〜1です。 各行には異なる値があります。

この操作にはRandomScalarが必要で、そのパラメーターはオプションのランダムシードです。 次のコードは例を示しています。

from odps.df import RandomScalar
iris[iris, RandomScalar().rename('rand_val')][:5]

次の応答が返されます。

   sepallength  sepalwidth  petallength  petalwidth         name  rand_val
0          4.9         3.0          1.4         0.2  Iris-setosa  0.000471
1          4.7         3.2          1.3         0.2  Iris-setosa  0.799520
2          4.6         3.1          1.5         0.2  Iris-setosa  0.834609
3          5.0         3.6          1.4         0.2  Iris-setosa  0.106921
4          5.4         3.9          1.7         0.4  Iris-setosa  0.763442

データのフィルタリング

Collectionオブジェクトを使用すると、データをフィルタリングできます。 AND (&) 、OR (|) 、NOT (~) 、filter、ラムダ式、および複数のクエリメソッドを使用してデータをフィルタリングできます。

  • 例1: sepallengthの値が5より大きいデータを照会します。

    print(iris[iris.sepallength > 5].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          5.4         3.9          1.7         0.4  Iris-setosa
    1          5.4         3.7          1.5         0.2  Iris-setosa
    2          5.8         4.0          1.2         0.2  Iris-setosa
    3          5.7         4.4          1.5         0.4  Iris-setosa
    4          5.4         3.9          1.3         0.4  Iris-setosa
  • 例2: AND (&) 条件を使用します。

    print(iris[(iris.sepallength < 5) & (iris['petallength'] > 1.5)].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth             name
    0          4.8         3.4          1.6         0.2      Iris-setosa
    1          4.8         3.4          1.9         0.2      Iris-setosa
    2          4.7         3.2          1.6         0.2      Iris-setosa
    3          4.8         3.1          1.6         0.2      Iris-setosa
    4          4.9         2.4          3.3         1.0  Iris-versicolor
  • 例3: OR (|) 条件を使用します。

    print(iris[(iris.sepalwidth < 2.5) | (iris.sepalwidth > 4)].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth             name
    0          5.7         4.4          1.5         0.4      Iris-setosa
    1          5.2         4.1          1.5         0.1      Iris-setosa
    2          5.5         4.2          1.4         0.2      Iris-setosa
    3          4.5         2.3          1.3         0.3      Iris-setosa
    4          5.5         2.3          4.0         1.3  Iris-versicolor
    説明

    AND演算子を表すにはアンパサンド (&) を使用し、OR演算子を表すには垂直バー (|) を使用する必要があります。 およびまたは使用できません。

  • 例4: NOT (~) 条件を使用します。

    print(iris[~(iris.sepalwidth > 3)].head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          4.9         3.0          1.4         0.2  Iris-setosa
    1          4.4         2.9          1.4         0.2  Iris-setosa
    2          4.8         3.0          1.4         0.1  Iris-setosa
    3          4.3         3.0          1.1         0.1  Iris-setosa
    4          5.0         3.0          1.6         0.2  Iris-setosa
  • 例5: filterメソッドを明示的に呼び出し、複数のand条件を指定します。

    print(iris.filter(iris.sepalwidth > 3.5, iris.sepalwidth < 4).head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          5.0         3.6          1.4         0.2  Iris-setosa
    1          5.4         3.9          1.7         0.4  Iris-setosa
    2          5.4         3.7          1.5         0.2  Iris-setosa
    3          5.4         3.9          1.3         0.4  Iris-setosa
    4          5.7         3.8          1.7         0.3  Iris-setosa
  • 例6: 連続操作にラムダ式を使用します。

    print(iris[iris.sepalwidth > 3.8]['name', lambda x: x.sepallength + 1].head(5))

    次の応答が返されます。

              name  sepallength
    0  Iris-setosa          6.4
    1  Iris-setosa          6.8
    2  Iris-setosa          6.7
    3  Iris-setosa          6.4
    4  Iris-setosa          6.2
  • 例7: BOOLEAN型の列を含むCollectionオブジェクトの場合、その列をフィルター条件として使用します。

    # Query the schema.
    print(df.dtypes)
    # Obtain the returned result.
    odps.Schema {
      a boolean
      b int64
    }
    
    # Use Column a of the BOOLEAN type to filter data.
    print(df[df.a])
    # Obtain the returned result.
          a  b
    0  True  1
    1  True  3

    Collectionオブジェクトから単一のSequenceを取得する場合、有効なフィルター条件として使用できるのはBOOLEAN型の列だけです。

    df[df.a, ]       # Retrieve a one-column collection. 
    df[[df.a]]       # Retrieve a one-column collection. 
    df.select(df.a)  # Explicitly retrieve a one-column collection. 
    df[df.a]         # Use Column a of the BOOLEAN type to filter data. 
    df.a             # Retrieve a column from a collection. 
    df['a']          # Retrieve a column from a collection.

  • 例8: Pandasのqueryメソッドを使用して、クエリステートメントを使用してデータをフィルタリングし、式でsepallengthなどの列名を直接使用して操作を実行します。 クエリ文では、&andの両方がand演算子を示し、|orの両方がor演算子を示します。

    print(iris.query("(sepallength < 5) and (petallength > 1.5)").head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth             name
    0          4.8         3.4          1.6         0.2      Iris-setosa
    1          4.8         3.4          1.9         0.2      Iris-setosa
    2          4.7         3.2          1.6         0.2      Iris-setosa
    3          4.8         3.1          1.6         0.2      Iris-setosa
    4          4.9         2.4          3.3         1.0  Iris-versicolor

    式でローカル変数が必要な場合は、変数名の前にat記号 (@) を追加します。

    var = 4
    print(iris.query("(sepalwidth < 2.5) | (sepalwidth > @var)").head(5))

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth             name
    0          5.7         4.4          1.5         0.4      Iris-setosa
    1          5.2         4.1          1.5         0.1      Iris-setosa
    2          5.5         4.2          1.4         0.2      Iris-setosa
    3          4.5         2.3          1.3         0.3      Iris-setosa
    4          5.5         2.3          4.0         1.3  Iris-versicolor

    次の表に、queryメソッドの構文を示します。

    構文

    説明

    name

    アットサイン (@) プレフィックスがないすべての列は、列名として扱われます。 列にそのようなプレフィックスがある場合、ローカル変数が取得されます。

    operator

    次の演算子がサポートされています。+,-,*,/,//,%,**,==,!=,<,<=,>,>=,、およびではない.

    bool

    ANDまたはor演算。 &and演算子を表します。 | およびorはOR演算子を表します。

    attribute

    オブジェクトの属性。

    index、slice、subscript

    スライス操作。

列を行に変換する

  • explodeメソッドを使用して、LISTまたはMAPタイプの列を複数の行に変換できます。 複数行の出力操作にapplyメソッドを使用することもできます。 集計などの操作の場合、出力行を元のテーブルの列とマージする必要があります。 この場合、DataFrameの複数行出力機能を使用できます。 この機能を使用すると、複数行出力関数によって生成された一連のデータを、元のセットの列名にマップできます。 次の例は、複数行出力機能の使用方法を示しています。

    • サンプルデータを照会します。

      print(df)

      次の応答が返されます。

         id         a             b
      0   1  [a1, b1]  [a2, b2, c2]
      1   2      [c1]      [d2, e2]
    • 例 1:

      print(df[df.id, df.a.explode(), df.b])

      次の応答が返されます。

         id   a             b
      0   1  a1  [a2, b2, c2]
      1   1  b1  [a2, b2, c2]
      2   2  c1      [d2, e2]
    • 例 2:

      print(df[df.id, df.a.explode(), df.b.explode()])

      次の応答が返されます。

         id   a   b
      0   1  a1  a2
      1   1  a1  b2
      2   1  a1  c2
      3   1  b1  a2
      4   1  b1  b2
      5   1  b1  c2
      6   2  c1  d2
      7   2  c1  e2
  • explodeメソッドが入力行の出力を生成しない場合、入力行はデフォルトで出力に表示されません。 出力の行を保持するには、設定keep_nulls=Trueを追加します。 この場合、行にnull値が表示されます。 次のコードは例を示しています。

    • サンプルデータを照会します。

      print(df)

      次の応答が返されます。

         id         a
      0   1  [a1, b1]
      1   2        []
    • 例 1:

      print(df[df.id, df.a.explode()])

      次の応答が返されます。

         id   a
      0   1  a1
      1   1  b1
    • 例 2:

      print(df[df.id, df.a.explode(keep_nulls=True)])

      次の応答が返されます。

         id     a
      0   1    a1
      1   1    b1
      2   2  None
  • explodeメソッドを使用して複数行の出力を実装する方法の詳細については、「列操作」の「コレクション関連の操作」を参照してください。

出力制限

  • データの最初の3行を返します。

    print(iris[:3].execute())

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          4.9         3.0          1.4         0.2  Iris-setosa
    1          4.7         3.2          1.3         0.2  Iris-setosa
    2          4.6         3.1          1.5         0.2  Iris-setosa
  • MaxCompute SQLでは、バックエンドスライス操作はstartメソッドとstepメソッドをサポートしていませんが、limitメソッドをサポートしています。

    print(iris.limit(3).execute())

    次の応答が返されます。

       sepallength  sepalwidth  petallength  petalwidth         name
    0          4.9         3.0          1.4         0.2  Iris-setosa
    1          4.7         3.2          1.3         0.2  Iris-setosa
    2          4.6         3.1          1.5         0.2  Iris-setosa
    説明

    スライス操作は、シーケンスオブジェクトではなく、コレクションオブジェクトに対して実行できます。