このトピックでは、DataFrameで実行できる操作について説明します。 データの並べ替え、重複排除、サンプリング、およびスケーリングができます。 null値を処理することもできます。
前提条件
次の要件が満たされていることを確認してください。
pyodps_irisという名前のテーブルが用意されています。 詳細については、入門の「DataFrameデータ処理」セクションをご参照ください。
DataFrameが作成されます。
from odps.df import DataFrame iris = DataFrame(o.get_table('pyodps_iris'))
データの並び替え
コレクション内のデータのみをソートできます。
sortまたはsort_valuesメソッドを呼び出して、データを並べ替えます。>>> iris.sort('sepalwidth').head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.2 2.2 4.5 1.5 Iris-versicolor 2 6.0 2.2 5.0 1.5 Iris-virginica 3 6.0 2.2 4.0 1.0 Iris-versicolor 4 5.5 2.3 4.0 1.3 Iris-versicolorデータを降順にソートするには、
ascending=False;設定を追加します。>>> iris.sort('sepalwidth', ascending=False).head(5) sepallength sepalwidth petallength petalwidth name 0 5.7 4.4 1.5 0.4 Iris-setosa 1 5.5 4.2 1.4 0.2 Iris-setosa 2 5.2 4.1 1.5 0.1 Iris-setosa 3 5.8 4.0 1.2 0.2 Iris-setosa 4 5.4 3.9 1.3 0.4 Iris-setosa-を使用してデータを降順に並べ替えます。>>> iris.sort(-iris.sepalwidth).head(5) sepallength sepalwidth petallength petalwidth name 0 5.7 4.4 1.5 0.4 Iris-setosa 1 5.5 4.2 1.4 0.2 Iris-setosa 2 5.2 4.1 1.5 0.1 Iris-setosa 3 5.8 4.0 1.2 0.2 Iris-setosa 4 5.4 3.9 1.3 0.4 Iris-setosa複数のフィールドに基づいてデータを並べ替えます。
>>> iris.sort(['sepalwidth', 'petallength']).head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.0 2.2 4.0 1.0 Iris-versicolor 2 6.2 2.2 4.5 1.5 Iris-versicolor 3 6.0 2.2 5.0 1.5 Iris-virginica 4 4.5 2.3 1.3 0.3 Iris-setosa異なる順序の複数のフィールドに基づいてデータをソートする場合、
ascendingパラメーターを使用して、ソートするデータのリストを表示できます。 列の数はフィールドの数と同じでなければなりません。 フィールド値はBOOLEAN型でなければなりません。>>> iris.sort(['sepalwidth', 'petallength'], ascending=[True, False]).head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.0 2.2 5.0 1.5 Iris-virginica 2 6.2 2.2 4.5 1.5 Iris-versicolor 3 6.0 2.2 4.0 1.0 Iris-versicolor 4 6.3 2.3 4.4 1.3 Iris-versicolor次のサンプルコードは、複数のフィールドに基づいてデータをソートする別の例を示しています。
>>> iris.sort(['sepalwidth', -iris.petallength]).head(5) sepallength sepalwidth petallength petalwidth name 0 5.0 2.0 3.5 1.0 Iris-versicolor 1 6.0 2.2 5.0 1.5 Iris-virginica 2 6.2 2.2 4.5 1.5 Iris-versicolor 3 6.0 2.2 4.0 1.0 Iris-versicolor 4 6.3 2.3 4.4 1.3 Iris-versicolor説明Python on MaxCompute (PyODPS) でデータをソートするには、
options.df.odps.sort.limitパラメーターを設定して、ソートする行数を指定する必要があります。 options.df.odps.sort.limitパラメーターのデフォルト値は10000です。 パラメーターを10000より大きい値に設定できます。 ただし、この設定はメモリ不足 (OOM) の問題を引き起こす可能性があります。
重複排除データ
コレクション内のデータの重复を解消するには、次の方法で
distinctメソッドを呼び出してデータの重复を解消します。>>> iris[['name']].distinct() name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginica>>> iris.distinct('name') name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginica>>> iris.distinct('name', 'sepallength').head(3) name sepallength 0 Iris-setosa 4.3 1 Iris-setosa 4.4 2 Iris-setosa 4.5
uniqueのメソッドを呼び出して、データのシーケンスを重複排除します。 ただし、uniqueのメソッドを呼び出すシーケンスを使用して列を選択することはできません。>>> iris.name.unique() name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginica無効なサンプルコード:
>>> iris[iris.name, iris.name.unique()]
サンプルデータ
コレクションからデータをサンプリングするには、sampleメソッドを呼び出します。 PyODPSは、次のサンプリング方法をサポートします。
MaxCompute DataFrameは、部分ごとのサンプリングを除き、次のサンプリング方法を実行するために、プロジェクトでXFlowをサポートする必要があります。 MaxCompute DataFrameがXFlowをサポートしていない場合、Pandas DataFrameのバックエンドでのみサンプリングメソッドを実行できます。
部品によるサンプリング
このサンプリング方法を用いてデータを
partsに分割する。 番号でパーツを選択できます。>>> iris.sample(parts=10) # Split data into 10 parts and sample data of the part numbered 0 by default. >>> iris.sample(parts=10, i=0) # Split data into 10 parts and manually sample data of the part numbered 0. >>> iris.sample(parts=10, i=[2, 5]) # Split data into 10 parts and sample data of the parts numbered 2 and 5. >>> iris.sample(parts=10, columns=['name', 'sepalwidth']) # Sample the data by name and sepalwidth.重量によるサンプリング
この方法を使用するときに、重み列、レコード数、およびサンプリングするレコードの割合を指定できます。 置換によるサンプリングを有効にするには、
replaceパラメーターをTrueに設定します。>>> iris.sample(n=100, weights='sepal_length') >>> iris.sample(n=100, weights='sepal_width', replace=True)階層化サンプリング
このサンプリング方法を使用するには、階層化のラベル列を指定し、サンプリング比率またはサンプリングするレコード数を指定します。
fracパラメーターを設定してサンプリング比率を指定し、nパラメーターを設定してサンプリングするレコード数を指定できます。 このサンプリング方法は、置換を伴うサンプリングをサポートしない。>>> iris.sample(strata='category', n={'Iris Setosa': 10, 'Iris Versicolour': 10}) >>> iris.sample(strata='category', frac={'Iris Setosa': 0.5, 'Iris Versicolour': 0.4})
スケールデータ
DataFrameは、最大値、最小値、平均値、または標準偏差に基づくデータスケーリングをサポートします。 次のデータは例を示しています。
name id fid
0 name1 4 5.3
1 name2 2 3.5
2 name2 3 1.5
3 name1 4 4.2
4 name1 3 2.2
5 name1 3 4.1min_max_scaleメソッドを使用してデータを正規化します。df.min_max_scale(columns=['fid']) name id fid 0 name1 4 1.000000 1 name2 2 0.526316 2 name2 3 0.000000 3 name1 4 0.710526 4 name1 3 0.184211 5 name1 3 0.684211min_max_scaleメソッドをfeature_rangeパラメーターと共に使用して、出力値の範囲を指定します。 次の例は、出力値を (-1, 1) の範囲に保つ方法を示しています。df.min_max_scale(columns=['fid'], feature_range=(-1, 1)) name id fid 0 name1 4 1.000000 1 name2 2 0.052632 2 name2 3 -1.000000 3 name1 4 0.421053 4 name1 3 -0.631579 5 name1 3 0.368421元の値を保持する必要がある場合は、
preserveパラメーターを使用します。 スケーリングされたデータが新しい列として追加されます。 デフォルトでは、元の列名に _scaledサフィックスを追加することで、新しい列の名前が付けられます。suffixパラメーターを使用して、サフィックス名を変更できます。df.min_max_scale(columns=['fid'], preserve=True) name id fid fid_scaled 0 name1 4 5.3 1.000000 1 name2 2 3.5 0.526316 2 name2 3 1.5 0.000000 3 name1 4 4.2 0.710526 4 name1 3 2.2 0.184211 5 name1 3 4.1 0.684211min_max_scaleメソッドをgroupパラメーターと共に使用して、1つ以上のグループ列を指定し、指定した列から最小値と最大値を取得してデータをスケーリングします。df.min_max_scale(columns=['fid'], group=['name']) name id fid 0 name1 4 1.000000 1 name1 4 0.645161 2 name1 3 0.000000 3 name1 3 0.612903 4 name2 2 1.000000 5 name2 3 0.000000上記の例では、
name1とname2の両方のデータが、2つのグループの最小値と最大値に基づいてスケーリングされることを示しています。標準正規分布に基づいてデータをスケーリングするには、
std_scaleメソッドを使用します。std_scaleメソッドでは、元の列を保持するようにpreserveパラメーターを設定し、データをグループ化するようにgroupパラメーターを設定できます。df.std_scale(columns=['fid']) name id fid 0 name1 4 1.436467 1 name2 2 0.026118 2 name2 3 -1.540938 3 name1 4 0.574587 4 name1 3 -0.992468 5 name1 3 0.496234
null値を処理する
DataFrameを使用すると、null値を持つ行を削除し、null値を埋めることができます。 Sample data:
id name f1 f2 f3 f4
0 0 name1 1.0 NaN 3.0 4.0
1 1 name1 2.0 NaN NaN 1.0
2 2 name1 3.0 4.0 1.0 NaN
3 3 name1 NaN 1.0 2.0 3.0
4 4 name1 1.0 NaN 3.0 4.0
5 5 name1 1.0 2.0 3.0 4.0
6 6 name1 NaN NaN NaN NaNdropnaメソッドを使用して、subsetオブジェクトのnull値を含む行を削除します。df.dropna(subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 5 name1 1.0 2.0 3.0 4.0null以外の値を含む行を保持するには、設定
how='all'を追加します。df.dropna(how='all', subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 NaN 3.0 4.0 1 1 name1 2.0 NaN NaN 1.0 2 2 name1 3.0 4.0 1.0 NaN 3 3 name1 NaN 1.0 2.0 3.0 4 4 name1 1.0 NaN 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0threshパラメーターを使用して、1行のnull以外の値の最小数を指定します。df.dropna(thresh=3, subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 NaN 3.0 4.0 2 2 name1 3.0 4.0 1.0 NaN 3 3 name1 NaN 1.0 2.0 3.0 4 4 name1 1.0 NaN 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0fillnaメソッドを呼び出して、null値を既存の列の定数または値に置き換えます。次の例は、null値を定数に置き換える方法を示しています。
df.fillna(100, subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 100.0 3.0 4.0 1 1 name1 2.0 100.0 100.0 1.0 2 2 name1 3.0 4.0 1.0 100.0 3 3 name1 100.0 1.0 2.0 3.0 4 4 name1 1.0 100.0 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 100.0 100.0 100.0 100.0次の例は、null値を既存の列の値に置き換える方法を示しています。
df.fillna(df.f2, subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 NaN 3.0 4.0 1 1 name1 2.0 NaN NaN 1.0 2 2 name1 3.0 4.0 1.0 4.0 3 3 name1 1.0 1.0 2.0 3.0 4 4 name1 1.0 NaN 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 NaN NaN NaN NaN
DataFrameは、null値を埋めるための後方充填と前方充填をサポートします。 次の表に、
methodパラメーターの有効な値を定義します。値
説明
bfillかbackfill
後方充填
ffillかpad
前方充填
例:
df.fillna(method='bfill', subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 3.0 3.0 4.0 1 1 name1 2.0 1.0 1.0 1.0 2 2 name1 3.0 4.0 1.0 NaN 3 3 name1 1.0 1.0 2.0 3.0 4 4 name1 1.0 3.0 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 NaN NaN NaN NaN df.fillna(method='ffill', subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 0 name1 1.0 1.0 3.0 4.0 1 1 name1 2.0 2.0 2.0 1.0 2 2 name1 3.0 4.0 1.0 1.0 3 3 name1 NaN 1.0 2.0 3.0 4 4 name1 1.0 1.0 3.0 4.0 5 5 name1 1.0 2.0 3.0 4.0 6 6 name1 NaN NaN NaN NaNffillまたはbfill関数を使用してコードを簡略化することもできます。ffill関数は、fillna(method='fffill')と同等です。bfill関数は、fillna(method='bfill')に相当します。