全部产品
Search
文档中心

MaxCompute:Operasi Kolom

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan DataFrame API untuk melakukan operasi kolom.

Operasi Kolom

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

Menambahkan konstanta atau menjalankan fungsi sin pada objek urutan akan menerapkan operasi tersebut pada semua elemen dalam objek urutan.

Fungsi terkait null

DataFrame API menyediakan fungsi bawaan terkait null, seperti isnull, notnull, dan fillna. Fungsi isnull digunakan untuk memeriksa apakah nilai suatu bidang adalah null. Fungsi notnull digunakan untuk memeriksa apakah nilai suatu bidang bukan null. Fungsi fillna mengganti nilai null dengan nilai yang ditentukan.

>>> iris.sepallength.isnull().head(5)
   sepallength
0        False
1        False
2        False
3        False
4        False

Fungsi logika

Fungsi ifelse berlaku untuk tipe BOOLEAN. Jika kondisi benar, ia mengembalikan parameter pertama; jika tidak, ia mengembalikan parameter kedua.

>>> (iris.sepallength > 5).ifelse('gt5', 'lte5').rename('cmp5').head(5)
   cmp5
0   gt5
1  lte5
2  lte5
3  lte5
4  lte5

Fungsi switch dapat digunakan untuk menangani beberapa kondisi.

>>> iris.sepallength.switch(4.9, 'eq4.9', 5.0, 'eq5.0', default='noeq').rename('equalness').head(5)
   equalness
0       noeq
1      eq4.9
2       noeq
3       noeq
4      eq5.0
>>> from odps.df import switch
>>> switch(iris.sepallength == 4.9, 'eq4.9', iris.sepallength == 5.0, 'eq5.0', default='noeq').rename('equalness').head(5)
   equalness
0       noeq
1      eq4.9
2       noeq
3       noeq
4      eq5.0

Pada Python di MaxCompute (PyODPS) versi 0.7.8 ke atas, Anda dapat memodifikasi nilai kolom dalam dataset berdasarkan kondisi tertentu.

>>> iris[iris.sepallength > 5, 'cmp5'] = 'gt5'
>>> iris[iris.sepallength <= 5, 'cmp5'] = 'lte5'
>>> iris.head(5)
   cmp5
0   gt5
1  lte5
2  lte5
3  lte5
4  lte5

Operasi matematika

Objek urutan numerik mendukung operasi matematika seperti penambahan (+), pengurangan (-), perkalian (*), pembagian (/), serta fungsi log dan sin.

>>> (iris.sepallength * 10).log().head(5)
   sepallength
0     3.931826
1     3.891820
2     3.850148
3     3.828641
4     3.912023
>>> fields = [iris.sepallength,
>>>           (iris.sepallength / 2).rename('sepallength dibagi 2'),
>>>           (iris.sepallength ** 2).rename('sepallength kuadrat')]
>>> iris[fields].head(5)
   sepallength  sepallength dibagi 2  sepallength kuadrat
0          5.1              2.55             26.01
1          4.9              2.45             24.01
2          4.7              2.35             22.09
3          4.6              2.30             21.16
4          5.0              2.50             25.00

Tabel berikut menggambarkan operasi aritmatika yang didukung.

Operasi Aritmatika

Deskripsi

abs

Mengembalikan nilai absolut dari angka yang diberikan.

sqrt

Mengembalikan akar kuadrat dari angka yang diberikan.

sin

N/A

sinh

N/A

cos

N/A

cosh

N/A

tan

N/A

tanh

N/A

arccos

N/A

arccosh

N/A

arcsin

N/A

arcsinh

N/A

arctan

N/A

arctanh

N/A

exp

Mengembalikan e dipangkatkan ke angka yang diberikan.

expm1

Mengembalikan e dipangkatkan ke angka yang diberikan, dikurangi 1.

log

Mengembalikan logaritma dari angka yang diberikan dengan menggunakan basis yang disuplai.

log2

N/A

log10

N/A

log1p

log(1+x)

radians

Mengonversi nilai dalam radian ke derajat.

degrees

Mengonversi nilai dalam derajat ke radian.

ceil

Mengembalikan bilangan bulat terkecil yang tidak kurang dari angka yang diberikan.

floor

Mengembalikan bilangan bulat terbesar yang tidak lebih besar dari angka yang diberikan.

trunc

Mengembalikan angka yang dipotong hingga tempat desimal yang ditentukan.

Anda dapat membandingkan objek urutan dengan urutan lain atau objek skalar.

>>> (iris.sepallength < 5).head(5)
   sepallength
0        False
1         True
2         True
3         True
4        False

DataFrame API tidak mendukung perbandingan berurutan seperti 3 <= iris.sepallength <= 5. Namun, Anda dapat menggunakan fungsi between untuk memeriksa apakah nilai dari iris.sepallength berada dalam interval tertentu.

>>> (iris.sepallength.between(3, 5)).head(5)
   sepallength
0        False
1         True
2         True
3         True
4         True

Secara default, fungsi between mencakup titik akhir interval. Untuk menentukan interval terbuka, atur parameter inclusive ke False.

>>> (iris.sepallength.between(3, 5, inclusive=False)).head(5)
   sepallength
0        False
1         True
2         True
3         True
4        False

Operasi terkait string

DataFrame API menyediakan berbagai operasi terkait string untuk objek urutan atau skalar.

>>> fields = [
>>>     iris.name.upper().rename('upper_name'),
>>>     iris.name.extract('Iris(.*)', group=1)
>>> ]
>>> iris[fields].head(5)
    upper_name     name
0  IRIS-SETOSA  -setosa
1  IRIS-SETOSA  -setosa
2  IRIS-SETOSA  -setosa
3  IRIS-SETOSA  -setosa
4  IRIS-SETOSA  -setosa

Tabel berikut menggambarkan operasi terkait string.

Operasi

Deskripsi

capitalize

N/A

contains

Mengembalikan apakah string yang diberikan mengandung substring. Substring adalah ekspresi reguler jika parameter regex diatur ke True. Parameter regex diatur ke True secara default.

count

Mengembalikan jumlah kemunculan string yang ditentukan.

endswith

Mengakhiri string yang diberikan dengan string yang ditentukan.

startswith

Memulai string yang diberikan dengan string yang ditentukan.

extract

Mengekstrak ekspresi reguler. Jika grup tidak ditentukan, substring yang memenuhi pola ekspresi reguler dikembalikan. Jika grup ditentukan, grup yang ditentukan dikembalikan.

find

Mencari dari kiri ke kanan dan mengembalikan posisi kemunculan pertama substring yang ditentukan. Jika tidak ada substring yang cocok, nilai -1 dikembalikan.

rfind

Mencari dari kanan ke kiri dan mengembalikan posisi kemunculan pertama substring yang ditentukan. Jika tidak ada substring yang cocok, nilai -1 dikembalikan.

replace

Mengganti substring yang memenuhi pola ekspresi reguler dengan substring lain. Jika Anda menentukan parameter n, substring diganti sebanyak n kali.

get

Mengembalikan string pada posisi yang ditentukan.

len

Mengembalikan panjang string yang diberikan.

ljust

Menambahkan string yang diberikan dengan karakter yang ditentukan oleh fillchar di sebelah kanan hingga string mencapai panjang yang ditentukan oleh width. Karakter tambahan default adalah spasi.

rjust

Menambahkan string yang diberikan dengan karakter yang ditentukan oleh fillchar di sebelah kiri hingga string mencapai panjang yang ditentukan oleh width. Karakter tambahan default adalah spasi.

lower

Mengonversi string yang diberikan menjadi huruf kecil.

upper

Mengonversi string yang diberikan menjadi huruf besar.

lstrip

Menghapus spasi di sisi kiri string yang diberikan, termasuk baris kosong.

rstrip

Menghapus spasi di sisi kanan string yang diberikan, termasuk baris kosong.

strip

Menghapus spasi di kedua sisi string yang diberikan, termasuk baris kosong.

split

Memisahkan string yang diberikan pada pemisah yang ditentukan dan mengembalikan nilai tipe LIST<STRING>.

pad

Menambahkan string yang diberikan dengan karakter yang ditentukan oleh fillchar pada posisi yang ditentukan, yang bisa di sisi kiri, kanan, atau kedua sisi string. Karakter tambahan default adalah spasi.

repeat

Mengulang sebanyak n kali.

slice

Menjalankan operasi slice.

swapcase

Mengonversi semua karakter huruf besar menjadi huruf kecil dan semua karakter huruf kecil menjadi huruf besar dalam string yang diberikan.

title

Mengembalikan versi titlecased dari string yang diberikan di mana kata-kata dimulai dengan karakter huruf besar dan karakter sisanya huruf kecil. Operasi ini sama dengan operasi str.title.

zfill

Menambahkan string yang diberikan dengan karakter 0 di sisi kiri string hingga string mencapai panjang yang ditentukan oleh width.

isalnum

Mengembalikan True jika semua karakter dalam string yang diberikan adalah alfanumerik. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isalnum.

isalpha

Mengembalikan True jika semua karakter dalam string yang diberikan adalah alfabet. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isalpha.

isdigit

Mengembalikan True jika semua karakter dalam string yang diberikan adalah digit. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isdigit.

isspace

Mengembalikan True jika semua karakter dalam string yang diberikan adalah spasi. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isspace.

islower

Mengembalikan True jika semua karakter bersyarat dalam string yang diberikan adalah huruf kecil. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.islower.

isupper

Mengembalikan True jika semua karakter bersyarat dalam string yang diberikan adalah huruf besar. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isupper.

istitle

Mengembalikan True jika string yang diberikan adalah string bertitel. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.istitle.

isnumeric

Mengembalikan True jika semua karakter dalam string yang diberikan adalah numerik. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isnumeric.

isdecimal

Mengembalikan True jika semua karakter dalam string yang diberikan adalah karakter desimal. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi str.isdecimal.

todict

Memisahkan string yang diberikan pada pemisah yang ditentukan menjadi dict dan mengembalikan nilai tipe DICT<STRING, STRING>. Dua parameter input adalah pemisah proyek dan pemisah kunci-nilai.

strptime

Mengonversi string yang diberikan yang mewakili waktu ke format yang ditentukan. Format waktu sama dengan format waktu dalam pustaka Python standar. Untuk informasi lebih lanjut tentang format waktu di Python, lihat Tipe dasar tanggal dan waktu.

Operasi terkait waktu

Anda dapat memanggil fungsi bawaan terkait waktu untuk mengelola objek urutan atau skalar tipe DATETIME.

>>> df = lens[[lens.unix_timestamp.astype('datetime').rename('dt')]]
>>> df[df.dt,
>>>    df.dt.year.rename('year'),
>>>    df.dt.month.rename('month'),
>>>    df.dt.day.rename('day'),
>>>    df.dt.hour.rename('hour')].head(5)
                    dt  year  month  day  hour
0  1998-04-08 11:02:00  1998      4    8    11
1  1998-04-08 10:57:55  1998      4    8    10
2  1998-04-08 10:45:26  1998      4    8    10
3  1998-04-08 10:25:52  1998      4    8    10
4  1998-04-08 10:44:19  1998      4    8    10

Tabel berikut menggambarkan atribut terkait waktu.

Atribut terkait waktu

Deskripsi

year

N/A

month

N/A

day

N/A

hour

N/A

minute

N/A

second

N/A

weekofyear

Mengembalikan angka yang mewakili minggu dalam setahun di mana tanggal yang disediakan jatuh. Senin dianggap sebagai hari pertama dalam seminggu.

weekday

Mengembalikan angka yang mewakili hari dalam seminggu di mana tanggal yang disediakan jatuh.

dayofweek

Mengembalikan angka yang mewakili hari dalam seminggu di mana tanggal yang disediakan jatuh.

strftime

Mengonversi string yang diberikan yang mewakili waktu ke format yang ditentukan. Format waktu sama dengan waktu dalam pustaka Python standar. Untuk informasi lebih lanjut tentang format waktu di Python, lihat Tipe dasar tanggal dan waktu.

PyODPS juga mendukung penambahan dan pengurangan waktu. Misalnya, Anda dapat mengambil tanggal tiga hari sebelum tanggal saat ini. Anda juga dapat mengurangi satu kolom tanggal dari kolom lain untuk mendapatkan selisih dalam jumlah milidetik.

>>> df
                           a                          b
0 2016-12-06 16:43:12.460001 2016-12-06 17:43:12.460018
1 2016-12-06 16:43:12.460012 2016-12-06 17:43:12.460021
2 2016-12-06 16:43:12.460015 2016-12-06 17:43:12.460022
>>> from odps.df import day
>>> df.a - day(3)
                           a
0 2016-12-03 16:43:12.460001
1 2016-12-03 16:43:12.460012
2 2016-12-03 16:43:12.460015
>>> (df.b - df.a).dtype
int64
>>> (df.b - df.a).rename('a')
         a
0  3600000
1  3600000
2  3600000

Tabel berikut menggambarkan tipe DATETIME yang didukung.

Tipe

Deskripsi

year

N/A

month

N/A

day

N/A

hour

N/A

minute

N/A

second

N/A

millisecond

N/A

Operasi terkait koleksi

PyODPS mendukung koleksi tipe LIST dan DICT. Anda dapat menggunakan subskrip untuk mengambil item dari kedua tipe tersebut. Metode len dapat digunakan untuk mengambil jumlah item dalam setiap koleksi.

Selain itu, koleksi tipe LIST dan DICT mendukung metode explode. Metode ini digunakan untuk menampilkan isi koleksi. Untuk koleksi tipe LIST, metode explode secara default mengembalikan satu kolom. Jika parameter pos diatur ke True, metode ini mengembalikan dua kolom, salah satunya menunjukkan nomor seri setiap nilai dalam array. Fungsinya serupa dengan metode enumerate dalam Python. Untuk koleksi tipe DICT, metode explode mengembalikan dua kolom yang masing-masing menunjukkan kunci dan nilai. Nama kolom hasil dapat ditentukan dengan memberikan nama kolom ke metode explode.

Contoh berikut menunjukkan cara menggunakan metode explode:

>>> df
   id         a                            b
0   1  [a1, b1]  {'a2': 0, 'b2': 1, 'c2': 2}
1   2      [c1]           {'d2': 3, 'e2': 4}
>>> df[df.id, df.a[0], df.b['b2']]
   id   a    b
0   1  a1    1
1   2  c1  NaN
>>> df[df.id, df.a.len(), df.b.len()]
   id  a  b
0   1  2  3
1   2  1  2
>>> df.a.explode()
    a
0  a1
1  b1
2  c1
>>> df.a.explode(pos=True)
   a_pos   a
0      0  a1
1      1  b1
2      0  c1
>>> # Tentukan nama kolom.
>>> df.a.explode(['pos', 'value'], pos=True)
   pos value
0    0    a1
1    1    b1
2    0    c1
>>> df.b.explode()
  b_key  b_value
0    a2        0
1    b2        1
2    c2        2
3    d2        3
4    e2        4
>>> # Tentukan nama kolom.
>>> df.b.explode(['key', 'value'])
  key  value
0  a2      0
1  b2      1
2  c2      2
3  d2      3
4  e2      4

Metode explode dapat digabungkan dengan Koleksi. Kolom yang dihasilkan oleh metode explode dapat digabungkan dengan kolom asli.

>>> df[df.id, df.a.explode()]
   id   a
0   1  a1
1   1  b1
2   2  c1
>>> df[df.id, df.a.explode(), df.b.explode()]
   id   a b_key  b_value
0   1  a1    a2        0
1   1  a1    b2        1
2   1  a1    c2        2
3   1  b1    a2        0
4   1  b1    b2        1
5   1  b1    c2        2
6   2  c1    d2        3
7   2  c1    e2        4

Selain metode len dan explode, koleksi tipe LIST mendukung dua metode tambahan.

Metode

Deskripsi

contains(v)

Memeriksa apakah daftar yang diberikan mengandung elemen tertentu.

sort

Mengurutkan daftar yang diberikan dan mengembalikan nilai tipe LIST.

Koleksi tipe DICT juga mendukung dua metode tambahan.

Metode

Deskripsi

keys

Mengambil kunci DICT dan mengembalikan nilai tipe LIST.

values

Mengambil nilai DICT dan mengembalikan nilai tipe LIST.

Operasi lainnya

Operasi isin digunakan untuk memeriksa apakah elemen dari objek urutan ada dalam koleksi tertentu. Operasi notin digunakan untuk memeriksa apakah elemen tidak ada dalam koleksi tersebut.

>>> iris.sepallength.isin([4.9, 5.1]).rename('sepallength').head(5)
   sepallength
0         True
1         True
2        False
3        False
4        False

Operasi cut digunakan untuk membagi data dalam objek urutan menjadi beberapa segmen.

>>> iris.sepallength.cut(range(6), labels=['0-1', '1-2', '2-3', '3-4', '4-5']).rename('sepallength_cut').head(5)
   sepallength_cut
0             None
1              4-5
2              4-5
3              4-5
4              4-5

Operasi include_under dan include_over digunakan untuk menentukan nilai maksimum dan minimum.

>>> labels = ['0-1', '1-2', '2-3', '3-4', '4-5', '5-']
>>> iris.sepallength.cut(range(6), labels=labels, include_over=True).rename('sepallength_cut').head(5)
   sepallength_cut
0               5-
1              4-5
2              4-5
3              4-5
4              4-5

Panggil fungsi bawaan atau UDF di MaxCompute

Untuk memanggil fungsi bawaan atau fungsi yang ditentukan pengguna (UDF) di MaxCompute untuk membuat kolom, gunakan fungsi func. Nilai yang dikembalikan oleh fungsi func secara default bertipe STRING. Parameter rtype dapat digunakan untuk menentukan tipe nilai yang dikembalikan.

>>> from odps.df import func
>>>
>>> iris[iris.name, func.rand(rtype='float').rename('rand')][:4]
>>> iris[iris.name, func.rand(10, rtype='float').rename('rand')][:4]
>>> # Panggil UDF yang didefinisikan di MaxCompute. Anda harus menentukan nama kolom jika nama kolom tidak dapat ditentukan secara otomatis.
>>> iris[iris.name, func.your_udf(iris.sepalwidth, iris.sepallength, rtype='float').rename('new_col')]
>>> # Panggil UDF dari proyek lain. Anda dapat menentukan nama kolom menggunakan parameter name.
>>> iris[iris.name, func.your_udf(iris.sepalwidth, iris.sepallength, rtype='float', project='udf_project', name='new_col')]
Catatan

Backend Pandas tidak mendukung eksekusi ekspresi yang mengandung fungsi func.