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

MaxCompute:データの並べ替え、重複排除、サンプル、変換

最終更新日:Jan 08, 2025

このトピックでは、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.1
  • min_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.684211
  • min_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.684211
  • min_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

    上記の例では、name1name2の両方のデータが、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  NaN
  • dropnaメソッドを使用して、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.0
  • null以外の値を含む行を保持するには、設定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.0
  • threshパラメーターを使用して、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.0
  • fillnaメソッドを呼び出して、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  NaN

    ffillまたはbfill関数を使用してコードを簡略化することもできます。 ffill関数は、fillna(method='fffill') と同等です。 bfill関数は、fillna(method='bfill') に相当します。