CollectionExpr mendukung semua operasi pada dataset dua dimensi DataFrame. Dapat dianggap sebagai tabel MaxCompute atau spreadsheet. Objek DataFrame juga merupakan objek CollectionExpr. CollectionExpr mendukung berbagai operasi seperti operasi kolom, penyaringan data, dan transformasi data.
Prasyarat
Pastikan persyaratan berikut terpenuhi:
Tabel bernama pyodps_iris telah disiapkan. Untuk informasi lebih lanjut, lihat bagian "Pemrosesan data DataFrame" di Memulai.
Objek DataFrame telah dibuat. Untuk informasi lebih lanjut, lihat bagian "Buat objek DataFrame dari tabel MaxCompute" di Buat objek DataFrame.
Ambil tipe
Anda dapat menggunakan metode dtypes untuk mengambil tipe semua kolom dalam objek CollectionExpr. Pada contoh ini, metode dtypes mengembalikan Tipe Skema. Berikut adalah contoh kodenya:
print(iris.dtypes)Hasil yang dikembalikan:
odps.Schema {
sepallength float64
sepalwidth float64
petallength float64
petalwidth float64
name string
}Pilih, tambah, dan hapus kolom
Pilih kolom
Gunakan sintaks expr[columns] untuk memilih kolom tertentu dari objek CollectionExpr. Contoh berikut menunjukkan implementasinya:
print(iris['name', 'sepallength'].head(5))Hasil yang dikembalikan:
name sepallength
0 Iris-setosa 4.9
1 Iris-setosa 4.7
2 Iris-setosa 4.6
3 Iris-setosa 5.0
4 Iris-setosa 5.4Jika hanya satu kolom diperlukan, tambahkan koma (,) setelah nama kolom atau tandai kolom sebagai daftar, misalnya iris[iris.sepallength,] atau iris[[iris.sepallength]]. Jika tidak, objek Sequence akan dikembalikan alih-alih objek Collection.
Hapus kolom
Gunakan metode
excludeuntuk mengecualikan kolom tertentu dari dataset baru. Contoh berikut menunjukkan implementasinya:print(iris.exclude('sepallength', 'petallength')[:5].head(5))Hasil yang dikembalikan:
sepalwidth petalwidth name 0 3.0 0.2 Iris-setosa 1 3.2 0.2 Iris-setosa 2 3.1 0.2 Iris-setosa 3 3.6 0.2 Iris-setosa 4 3.9 0.4 Iris-setosaDalam PyODPS versi 0.7.2 atau lebih baru, Anda dapat menggunakan sintaks baru untuk langsung mengecualikan kolom tertentu. Contoh berikut menunjukkan implementasinya:
del iris['sepallength'] del iris['petallength'] print(iris[:5].head(5))Hasil yang dikembalikan:
sepalwidth petalwidth name 0 3.0 0.2 Iris-setosa 1 3.2 0.2 Iris-setosa 2 3.1 0.2 Iris-setosa 3 3.6 0.2 Iris-setosa 4 3.9 0.4 Iris-setosa
Tambah kolom
Gunakan sintaks
expr[expr, new_sequence]untuk menambahkan kolom yang ditransformasi ke objek Collection yang ada. Kolom baru menjadi bagian dari objek Collection baru.Contoh berikut menambahkan kolom baru dengan menambahkan satu ke setiap nilai di kolom
sepalwidthdari tabeliris. Kolom baru diberi namasepalwidthplus1dan ditambahkan ke dataset yang ada. Contoh berikut menunjukkan implementasinya:print(iris[iris, (iris.sepalwidth + 1).rename('sepalwidthplus1')].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name \ 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosa 3 5.0 3.6 1.4 0.2 Iris-setosa 4 5.4 3.9 1.7 0.4 Iris-setosa sepalwidthplus1 0 4.0 1 4.2 2 4.1 3 4.6 4 4.9Jika menggunakan sintaks
expr[expr, new_sequence], kolom yang ditransformasi mungkin memiliki nama yang sama dengan kolom asli. Ubah nama kolom baru jika ingin menggabungkannya dengan objek Collection asli. Dalam PyODPS versi 0.7.2 atau lebih baru, Anda dapat langsung menambahkan kolom ke dataset saat ini. Contoh berikut menunjukkan implementasinya:iris['sepalwidthplus1'] = iris.sepalwidth + 1 print(iris.head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name \ 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosa 3 5.0 3.6 1.4 0.2 Iris-setosa 4 5.4 3.9 1.7 0.4 Iris-setosa sepalwidthplus1 0 4.0 1 4.2 2 4.1 3 4.6 4 4.9
Tambah dan hapus kolom secara bersamaan
Gunakan metode
excludeuntuk mengecualikan kolom asli dan menambahkan kolom baru ke dataset tanpa perlu mengubah nama kolom baru. Contoh berikut menunjukkan implementasinya:print(iris[iris.exclude('sepalwidth'), iris.sepalwidth * 2].head(5))Hasil yang dikembalikan:
sepallength petallength petalwidth name sepalwidth 0 4.9 1.4 0.2 Iris-setosa 6.0 1 4.7 1.3 0.2 Iris-setosa 6.4 2 4.6 1.5 0.2 Iris-setosa 6.2 3 5.0 1.4 0.2 Iris-setosa 7.2 4 5.4 1.7 0.4 Iris-setosa 7.8Dalam PyODPS versi 0.7.2 atau lebih baru, Anda dapat langsung menggunakan kolom baru untuk menimpa kolom asli pada dataset saat ini. Contoh berikut menunjukkan implementasinya:
iris['sepalwidth'] = iris.sepalwidth * 2 print(iris.head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.9 6.0 1.4 0.2 Iris-setosa 1 4.7 6.4 1.3 0.2 Iris-setosa 2 4.6 6.2 1.5 0.2 Iris-setosa 3 5.0 7.2 1.4 0.2 Iris-setosa 4 5.4 7.8 1.7 0.4 Iris-setosaUntuk menambah dan menghapus kolom secara bersamaan, gunakan metode
selectuntuk membuat objek Collection baru. Gunakan kolom yang dipilih sebagai parameter input dan ubah nama kolom menggunakan parameterkeyword. Contoh berikut menunjukkan implementasinya:print(iris.select('name', sepalwidthminus1=iris.sepalwidth - 1).head(5))Hasil yang dikembalikan:
name sepalwidthminus1 0 Iris-setosa 2.0 1 Iris-setosa 2.2 2 Iris-setosa 2.1 3 Iris-setosa 2.6 4 Iris-setosa 2.9Anda juga dapat melewati ekspresi lambda, yang mengambil hasil dari operasi sebelumnya sebagai parameter. Selama eksekusi, PyODPS memeriksa ekspresi lambda dan memasukkan objek Collection yang dihasilkan dari operasi sebelumnya dan menggantinya dengan kolom yang valid. Contoh berikut menunjukkan implementasinya:
print(iris['name', 'petallength'][[lambda x: x.name]].head(5))Hasil yang dikembalikan:
name 0 Iris-setosa 1 Iris-setosa 2 Iris-setosa 3 Iris-setosa 4 Iris-setosaDalam PyODPS versi 0.7.2 atau lebih baru, penugasan bersyarat didukung. Contoh berikut menunjukkan implementasinya:
iris[iris.sepallength > 5.0, 'sepalwidth'] = iris.sepalwidth * 2 print(iris.head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosa 3 5.0 3.6 1.4 0.2 Iris-setosa 4 5.4 7.8 1.7 0.4 Iris-setosa
Perkenalkan konstanta dan angka acak
Perkenalkan konstanta
DataFrame memungkinkan Anda menambahkan kolom konstanta ke objek Collection.
Scalardiperlukan untuk memperkenalkan konstanta. Tentukan nama kolom secara manual. Contoh berikut menunjukkan implementasinya:from odps.df import Scalar print(iris[iris, Scalar(1).rename('id')][:5].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name id 0 4.9 3.0 1.4 0.2 Iris-setosa 1 1 4.7 3.2 1.3 0.2 Iris-setosa 1 2 4.6 3.1 1.5 0.2 Iris-setosa 1 3 5.0 3.6 1.4 0.2 Iris-setosa 1 4 5.4 3.9 1.7 0.4 Iris-setosa 1Gunakan
NullScalaruntuk menentukan kolom null. Tentukan tipe bidang secara manual. Contoh berikut menunjukkan implementasinya:from odps.df import NullScalar print(iris[iris, NullScalar('float').rename('fid')][:5].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name fid 0 4.9 3.0 1.4 0.2 Iris-setosa None 1 4.7 3.2 1.3 0.2 Iris-setosa None 2 4.6 3.1 1.5 0.2 Iris-setosa None 3 5.0 3.6 1.4 0.2 Iris-setosa None 4 5.4 3.9 1.7 0.4 Iris-setosa NoneDalam PyODPS versi 0.7.12 atau lebih baru, sintaks yang lebih sederhana tersedia. Contoh berikut menunjukkan implementasinya:
iris['id'] = 1 print(iris.head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name id 0 4.9 3.0 1.4 0.2 Iris-setosa 1 1 4.7 3.2 1.3 0.2 Iris-setosa 1 2 4.6 3.1 1.5 0.2 Iris-setosa 1 3 5.0 3.6 1.4 0.2 Iris-setosa 1 4 5.4 3.9 1.7 0.4 Iris-setosa 1Jika menggunakan sintaks ini, tipe nilai null tidak dapat diidentifikasi secara otomatis. Oleh karena itu, gunakan kode berikut untuk menambahkan kolom null.
iris['null_col'] = NullScalar('float') print(iris.head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name null_col 0 4.9 3.0 1.4 0.2 Iris-setosa None 1 4.7 3.2 1.3 0.2 Iris-setosa None 2 4.6 3.1 1.5 0.2 Iris-setosa None 3 5.0 3.6 1.4 0.2 Iris-setosa None 4 5.4 3.9 1.7 0.4 Iris-setosa None
Perkenalkan angka acak
DataFrame memungkinkan Anda menambahkan kolom angka acak ke objek Collection. Tipe kolom adalah FLOAT dengan rentang nilai 0-1. Setiap baris memiliki nilai yang berbeda. RandomScalar diperlukan untuk operasi ini, dengan seed acak opsional sebagai parameternya. Contoh berikut menunjukkan implementasinya:
from odps.df import RandomScalar
iris[iris, RandomScalar().rename('rand_val')][:5]Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name rand_val
0 4.9 3.0 1.4 0.2 Iris-setosa 0.000471
1 4.7 3.2 1.3 0.2 Iris-setosa 0.799520
2 4.6 3.1 1.5 0.2 Iris-setosa 0.834609
3 5.0 3.6 1.4 0.2 Iris-setosa 0.106921
4 5.4 3.9 1.7 0.4 Iris-setosa 0.763442Filter data
Objek Collection memungkinkan Anda menyaring data menggunakan operator AND (&), OR (|), NOT (~), filter, ekspresi lambda, dan beberapa metode query.
Contoh 1: Query data dengan nilai
sepallengthlebih besar dari 5.print(iris[iris.sepallength > 5].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 5.4 3.9 1.7 0.4 Iris-setosa 1 5.4 3.7 1.5 0.2 Iris-setosa 2 5.8 4.0 1.2 0.2 Iris-setosa 3 5.7 4.4 1.5 0.4 Iris-setosa 4 5.4 3.9 1.3 0.4 Iris-setosaContoh 2: Gunakan kondisi AND (&).
print(iris[(iris.sepallength < 5) & (iris['petallength'] > 1.5)].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.8 3.4 1.6 0.2 Iris-setosa 1 4.8 3.4 1.9 0.2 Iris-setosa 2 4.7 3.2 1.6 0.2 Iris-setosa 3 4.8 3.1 1.6 0.2 Iris-setosa 4 4.9 2.4 3.3 1.0 Iris-versicolorContoh 3: Gunakan kondisi OR (|).
print(iris[(iris.sepalwidth < 2.5) | (iris.sepalwidth > 4)].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 5.7 4.4 1.5 0.4 Iris-setosa 1 5.2 4.1 1.5 0.1 Iris-setosa 2 5.5 4.2 1.4 0.2 Iris-setosa 3 4.5 2.3 1.3 0.3 Iris-setosa 4 5.5 2.3 4.0 1.3 Iris-versicolornullGunakan ampersand (
&) untuk merepresentasikan operator AND dan garis vertikal (|) untuk merepresentasikan operator OR.anddanortidak dapat digunakan.Contoh 4: Gunakan kondisi NOT (~).
print(iris[~(iris.sepalwidth > 3)].head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.4 2.9 1.4 0.2 Iris-setosa 2 4.8 3.0 1.4 0.1 Iris-setosa 3 4.3 3.0 1.1 0.1 Iris-setosa 4 5.0 3.0 1.6 0.2 Iris-setosaContoh 5: Secara eksplisit panggil metode
filterdan tentukan beberapa kondisi AND.print(iris.filter(iris.sepalwidth > 3.5, iris.sepalwidth < 4).head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 5.0 3.6 1.4 0.2 Iris-setosa 1 5.4 3.9 1.7 0.4 Iris-setosa 2 5.4 3.7 1.5 0.2 Iris-setosa 3 5.4 3.9 1.3 0.4 Iris-setosa 4 5.7 3.8 1.7 0.3 Iris-setosaContoh 6: Gunakan ekspresi lambda untuk operasi berkelanjutan.
print(iris[iris.sepalwidth > 3.8]['name', lambda x: x.sepallength + 1].head(5))Hasil yang dikembalikan:
name sepallength 0 Iris-setosa 6.4 1 Iris-setosa 6.8 2 Iris-setosa 6.7 3 Iris-setosa 6.4 4 Iris-setosa 6.2Contoh 7: Untuk objek Collection yang berisi kolom tipe BOOLEAN, gunakan kolom tersebut sebagai kondisi filter.
# Query the schema. print(df.dtypes) # Hasil yang diperoleh. odps.Schema { a boolean b int64 } # Gunakan Kolom a dengan tipe BOOLEAN untuk menyaring data. print(df[df.a]) # Hasil yang diperoleh. a b 0 True 1 1 True 3Saat mengambil Sequence tunggal dari objek Collection, hanya kolom tipe BOOLEAN yang dapat digunakan sebagai kondisi filter yang valid.
df[df.a, ] # Ambil koleksi satu kolom. df[[df.a]] # Ambil koleksi satu kolom. df.select(df.a) # Secara eksplisit ambil koleksi satu kolom. df[df.a] # Gunakan Kolom a dari tipe BOOLEAN untuk menyaring data. df.a # Ambil kolom dari koleksi. df['a'] # Ambil kolom dari koleksi.Contoh 8: Gunakan metode
querydi Pandas untuk menyaring data menggunakan pernyataan query dan langsung gunakan nama kolom sepertisepallengthdalam ekspresi untuk melakukan operasi. Dalam pernyataan query, baik&maupunandmenunjukkan operator AND, dan baik|maupunormenunjukkan operator OR.print(iris.query("(sepallength < 5) and (petallength > 1.5)").head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.8 3.4 1.6 0.2 Iris-setosa 1 4.8 3.4 1.9 0.2 Iris-setosa 2 4.7 3.2 1.6 0.2 Iris-setosa 3 4.8 3.1 1.6 0.2 Iris-setosa 4 4.9 2.4 3.3 1.0 Iris-versicolorJika variabel lokal diperlukan dalam sebuah ekspresi, tambahkan tanda at (
@) sebelum nama variabel.var = 4 print(iris.query("(sepalwidth < 2.5) | (sepalwidth > @var)").head(5))Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 5.7 4.4 1.5 0.4 Iris-setosa 1 5.2 4.1 1.5 0.1 Iris-setosa 2 5.5 4.2 1.4 0.2 Iris-setosa 3 4.5 2.3 1.3 0.3 Iris-setosa 4 5.5 2.3 4.0 1.3 Iris-versicolorTabel berikut menjelaskan sintaks metode
query.Sintaks
Deskripsi
name
Semua kolom yang tidak memiliki awalan tanda at (
@) dianggap sebagai nama kolom. Jika kolom memiliki awalan tersebut, variabel lokal akan diambil.operator
Operator berikut didukung:
+,-,*,/,//,%,**,==,!=,<,<=,>,>=,in, dannot in.bool
Operasi AND atau OR.
&danandmewakili operator AND.|danormewakili operator OR.attribute
Atribut objek.
index, slice, subscript
Operasi slice.
Konversi kolom menjadi baris
Gunakan metode
explodeuntuk mengubah kolom tipe LIST atau MAP menjadi beberapa baris. Anda juga dapat menggunakan metodeapplyuntuk operasi keluaran multi-baris. Untuk operasi seperti agregasi, gabungkan baris keluaran dengan kolom di tabel asli menggunakan fitur keluaran multi-baris DataFrame. Fitur ini memetakan sekumpulan data yang dihasilkan oleh fungsi keluaran multi-baris ke nama kolom di set asli. Contoh berikut menunjukkan cara menggunakan fitur ini.Query data sampel.
print(df)Hasil yang dikembalikan:
id a b 0 1 [a1, b1] [a2, b2, c2] 1 2 [c1] [d2, e2]Contoh 1:
print(df[df.id, df.a.explode(), df.b])Hasil yang dikembalikan:
id a b 0 1 a1 [a2, b2, c2] 1 1 b1 [a2, b2, c2] 2 2 c1 [d2, e2]Contoh 2:
print(df[df.id, df.a.explode(), df.b.explode()])Hasil yang dikembalikan:
id a b 0 1 a1 a2 1 1 a1 b2 2 1 a1 c2 3 1 b1 a2 4 1 b1 b2 5 1 b1 c2 6 2 c1 d2 7 2 c1 e2
Jika metode explode tidak menghasilkan keluaran untuk baris input, baris input tidak akan muncul di keluaran secara default. Untuk mempertahankan baris di keluaran, tambahkan konfigurasi
keep_nulls=True. Dalam hal ini, nilai null terdaftar di baris. Contoh berikut menunjukkan implementasinya:Query data sampel.
print(df)Hasil yang dikembalikan:
id a 0 1 [a1, b1] 1 2 []Contoh 1:
print(df[df.id, df.a.explode()])Hasil yang dikembalikan:
id a 0 1 a1 1 1 b1Contoh 2:
print(df[df.id, df.a.explode(keep_nulls=True)])Hasil yang dikembalikan:
id a 0 1 a1 1 1 b1 2 2 None
Untuk informasi lebih lanjut tentang cara menggunakan metode
explodeuntuk mengimplementasikan keluaran multi-baris, lihat bagian "Operasi terkait koleksi" di Operasi Kolom.
Batasan keluaran
Kembalikan tiga baris pertama data.
print(iris[:3].execute())Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosaDalam SQL MaxCompute, operasi slice backend tidak mendukung metode
startdanstep, tetapi mendukung metodelimit.print(iris.limit(3).execute())Hasil yang dikembalikan:
sepallength sepalwidth petallength petalwidth name 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosanullAnda dapat melakukan operasi slice pada objek Collection, bukan objek Sequence.