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 FalseFungsi 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 lte5Fungsi 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.0Pada 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 lte5Operasi 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.00Tabel 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 FalseDataFrame 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 TrueSecara 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 FalseOperasi 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 -setosaTabel berikut menggambarkan operasi terkait string.
Operasi | Deskripsi |
capitalize | N/A |
contains | Mengembalikan apakah string yang diberikan mengandung substring. Substring adalah ekspresi reguler jika parameter |
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 |
rjust | Menambahkan string yang diberikan dengan karakter yang ditentukan oleh |
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 |
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 |
zfill | Menambahkan string yang diberikan dengan karakter 0 di sisi kiri string hingga string mencapai panjang yang ditentukan oleh |
isalnum | Mengembalikan True jika semua karakter dalam string yang diberikan adalah alfanumerik. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
isalpha | Mengembalikan True jika semua karakter dalam string yang diberikan adalah alfabet. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
isdigit | Mengembalikan True jika semua karakter dalam string yang diberikan adalah digit. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
isspace | Mengembalikan True jika semua karakter dalam string yang diberikan adalah spasi. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
islower | Mengembalikan True jika semua karakter bersyarat dalam string yang diberikan adalah huruf kecil. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
isupper | Mengembalikan True jika semua karakter bersyarat dalam string yang diberikan adalah huruf besar. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
istitle | Mengembalikan True jika string yang diberikan adalah string bertitel. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
isnumeric | Mengembalikan True jika semua karakter dalam string yang diberikan adalah numerik. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
isdecimal | Mengembalikan True jika semua karakter dalam string yang diberikan adalah karakter desimal. Jika tidak, False dikembalikan. Operasi ini sama dengan operasi |
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 10Tabel 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 3600000Tabel 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 4Metode 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 4Selain 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 FalseOperasi 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-5Operasi 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-5Panggil 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')]Backend Pandas tidak mendukung eksekusi ekspresi yang mengandung fungsi func.