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
sortatausort_valuesuntuk 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-versicolorTambahkan 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-setosaGunakan
-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-setosaUrutkan 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-setosaJika Anda ingin mengurutkan data berdasarkan beberapa kolom dengan urutan berbeda, gunakan parameter
ascendinguntuk 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-versicolorBerikut 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-versicolornullUntuk mengurutkan data di Python pada MaxCompute (PyODPS), Anda perlu mengonfigurasi parameter
options.df.odps.sort.limituntuk 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
distinctsebagai 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
uniqueuntuk menghapus duplikat dalam urutan data. Namun, urutan yang menggunakan metodeuniquetidak dapat digunakan untuk memilih kolom tertentu.>>> iris.name.unique() name 0 Iris-setosa 1 Iris-versicolor 2 Iris-virginicaContoh 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:
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
partsmenggunakan 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
replaceke 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
fracuntuk menentukan proporsi pengambilan sampel dan parameternuntuk 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.1Gunakan metode
min_max_scaleuntuk 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.684211Gunakan metode
min_max_scaledengan parameterfeature_rangeuntuk 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.368421Untuk mempertahankan nilai asli, gunakan parameter
preserve. Data yang diskalakan ditambahkan sebagai kolom baru dengan akhiran _scaled secara default. Anda dapat mengubah nama akhiran menggunakan parametersuffix.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.684211Gunakan metode
min_max_scaledengan parametergroupuntuk 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.000000Contoh di atas menunjukkan bahwa data di
name1danname2diskalakan berdasarkan nilai minimum dan maksimum dari dua grup tersebut.Gunakan metode
std_scaleuntuk menskalakan data berdasarkan distribusi normal standar. Dalam metodestd_scale, Anda dapat mengonfigurasi parameterpreserveuntuk mempertahankan kolom asli, dan parametergroupuntuk 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 NaNGunakan metode
dropnauntuk menghapus baris yang berisi nilai null di objeksubset.df.dropna(subset=['f1', 'f2', 'f3', 'f4']) id name f1 f2 f3 f4 0 5 name1 1.0 2.0 3.0 4.0Untuk 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.0Gunakan parameter
threshuntuk 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.0Gunakan metode
fillnauntuk 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.0Contoh 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 NaNAnda juga dapat menggunakan fungsi
ffillataubfilluntuk menyederhanakan kode. Fungsiffillsetara denganfillna(method='ffill'). Fungsibfillsetara denganfillna(method='bfill').