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-setosaPyODPSバージョン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.9expr[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.8PyODPSバージョン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-setosaPyODPSバージョン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 NonePyODPSバージョン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 3Collectionオブジェクトから単一の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-setosaMaxCompute 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説明スライス操作は、シーケンスオブジェクトではなく、コレクションオブジェクトに対して実行できます。