全部产品
Search
文档中心

MaxCompute:Urutkan, hapus duplikat, ambil sampel, dan transformasi data

更新时间:Jun 19, 2025

Topik ini menjelaskan operasi yang dapat dilakukan pada DataFrame. Anda dapat mengurutkan, menghapus duplikat, mengambil sampel, dan menskalakan data. Selain itu, Anda juga dapat memproses nilai null.

Prasyarat

Pastikan persyaratan berikut terpenuhi:

  • Tabel bernama pyodps_iris telah disiapkan. Untuk informasi lebih lanjut, lihat bagian "Pengolahan Data DataFrame" di Memulai.

  • DataFrame telah dibuat.

    from odps.df import DataFrame
    iris = DataFrame(o.get_table('pyodps_iris'))

Urutkan data

Anda hanya dapat mengurutkan data dalam koleksi.

  • Gunakan metode sort atau sort_values untuk mengurutkan data.

    >>> 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
  • Tambahkan konfigurasi ascending=False; untuk mengurutkan data secara menurun.

    >>> 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
  • Gunakan - untuk mengurutkan data secara menurun.

    >>> 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
  • Urutkan data berdasarkan beberapa kolom.

    >>> 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
  • Jika Anda ingin mengurutkan data berdasarkan beberapa kolom dengan urutan berbeda, gunakan parameter ascending untuk menentukan daftar urutan pengurutan. Jumlah kolom harus sesuai dengan jumlah bidang, dan nilai bidang harus bertipe 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

    Berikut adalah contoh lain untuk mengurutkan data berdasarkan beberapa kolom.

    >>> 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
    null

    Untuk mengurutkan data di Python pada MaxCompute (PyODPS), Anda perlu mengonfigurasi parameter options.df.odps.sort.limit untuk menentukan jumlah baris yang akan diurutkan. Nilai default dari parameter ini adalah 10000. Anda dapat menaikkan batas ini, namun hal ini dapat menyebabkan kehabisan memori (OOM).

Hapus duplikat data

  • Untuk menghapus duplikat data dalam koleksi, gunakan metode distinct sebagai berikut:

    • >>> 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
  • Gunakan metode unique untuk menghapus duplikat dalam urutan data. Namun, urutan yang menggunakan metode unique tidak dapat digunakan untuk memilih kolom tertentu.

    >>> iris.name.unique()
                  name
    0      Iris-setosa
    1  Iris-versicolor
    2   Iris-virginica

    Contoh kode berikut tidak valid:

    >>> iris[iris.name, iris.name.unique()]

Ambil sampel data

Untuk mengambil sampel data dari koleksi, gunakan metode sample. PyODPS mendukung metode pengambilan sampel berikut:

null

MaxCompute DataFrame harus mendukung XFlow di proyek untuk menjalankan metode pengambilan sampel berikut, kecuali pengambilan sampel berdasarkan bagian. Jika MaxCompute DataFrame tidak mendukung XFlow, Anda hanya dapat menjalankan metode pengambilan sampel di backend Pandas DataFrame.

  • Pengambilan sampel berdasarkan bagian

    Data dibagi menjadi parts menggunakan metode ini. Anda dapat memilih bagian berdasarkan nomor.

    >>> iris.sample(parts=10)  # Pisahkan data menjadi 10 bagian dan ambil sampel data bagian bernomor 0 secara default.
    >>> iris.sample(parts=10, i=0)  # Pisahkan data menjadi 10 bagian dan ambil sampel data bagian bernomor 0 secara manual.
    >>> iris.sample(parts=10, i=[2, 5])   # Pisahkan data menjadi 10 bagian dan ambil sampel data bagian bernomor 2 dan 5.
    >>> iris.sample(parts=10, columns=['name', 'sepalwidth'])  # Ambil sampel data berdasarkan nama dan sepalwidth.
  • Pengambilan sampel berdasarkan bobot

    Tentukan kolom bobot, jumlah rekaman, dan proporsi rekaman yang ingin Anda ambil sampelnya. Aktifkan pengambilan sampel dengan pengembalian dengan mengatur parameter replace ke True.

    >>> iris.sample(n=100, weights='sepal_length')
    >>> iris.sample(n=100, weights='sepal_width', replace=True)
  • Pengambilan sampel berstrata

    Gunakan metode ini untuk menentukan kolom label stratifikasi serta proporsi atau jumlah rekaman yang ingin Anda ambil sampelnya. Konfigurasikan parameter frac untuk menentukan proporsi pengambilan sampel dan parameter n untuk menentukan jumlah rekaman. Metode ini tidak mendukung pengambilan sampel dengan pengembalian.

    >>> iris.sample(strata='category', n={'Iris Setosa': 10, 'Iris Versicolour': 10})
    >>> iris.sample(strata='category', frac={'Iris Setosa': 0.5, 'Iris Versicolour': 0.4})

Skala data

DataFrame mendukung penskalaan data berdasarkan nilai maksimum, minimum, rata-rata, atau deviasi standar. Berikut adalah contohnya:

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
  • Gunakan metode min_max_scale untuk menormalisasi data.

    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
  • Gunakan metode min_max_scale dengan parameter feature_range untuk menentukan rentang nilai keluaran. Contoh berikut menunjukkan cara menjaga nilai keluaran dalam rentang (-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
  • Untuk mempertahankan nilai asli, gunakan parameter preserve. Data yang diskalakan ditambahkan sebagai kolom baru dengan akhiran _scaled secara default. Anda dapat mengubah nama akhiran menggunakan parameter 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
  • Gunakan metode min_max_scale dengan parameter group untuk menentukan satu atau lebih kolom grup dan mengambil nilai minimum dan maksimum dari kolom tersebut untuk menskalakan data.

    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

    Contoh di atas menunjukkan bahwa data di name1 dan name2 diskalakan berdasarkan nilai minimum dan maksimum dari dua grup tersebut.

  • Gunakan metode std_scale untuk menskalakan data berdasarkan distribusi normal standar. Dalam metode std_scale, Anda dapat mengonfigurasi parameter preserve untuk mempertahankan kolom asli, dan parameter group untuk mengelompokkan data.

    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

Proses nilai null

DataFrame memungkinkan Anda menghapus baris dengan nilai null dan mengisi nilai null. Berikut adalah data sampel:

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
  • Gunakan metode dropna untuk menghapus baris yang berisi nilai null di objek subset.

    df.dropna(subset=['f1', 'f2', 'f3', 'f4'])
       id   name   f1   f2   f3   f4
    0   5  name1  1.0  2.0  3.0  4.0
  • Untuk mempertahankan baris yang berisi nilai non-null, tambahkan konfigurasi 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
  • Gunakan parameter thresh untuk menentukan jumlah minimum nilai non-null dalam baris.

    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
  • Gunakan metode fillna untuk mengganti nilai null dengan konstanta atau nilai dalam kolom yang ada.

    • Contoh berikut menunjukkan cara mengganti nilai null dengan konstanta:

      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
    • Contoh berikut menunjukkan cara mengganti nilai null dengan nilai dalam kolom yang ada:

      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 mendukung pengisian mundur dan pengisian maju untuk mengisi nilai null. Tabel berikut mendefinisikan nilai valid dari parameter method.

    Nilai

    Deskripsi

    bfill atau backfill

    Pengisian mundur

    ffill atau pad

    Pengisian maju

    Contoh

    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

    Anda juga dapat menggunakan fungsi ffill atau bfill untuk menyederhanakan kode. Fungsi ffill setara dengan fillna(method='ffill'). Fungsi bfill setara dengan fillna(method='bfill').