Python : Reformat Pandas Dataframe ‘Long to Wide’
Saat akan mengolah data, seringkali perlu merubah format dari data yang ada. Perubahan format (reformat/reshape) dapat berupa long menjadi wide maupun sebaliknya dari wide menjadi long. Merubah format long menjadi wide umumnya digunakan ketika kita memiliki raw data dan ingin membuat tabulasi dari data tersebut. Hal ini mirip seperti membuat tabulasi menggunakan Pivot Table pada Microsoft Excel. Sementara itu reformat data dari wide menjadi long sering kali diperlukan ketika mengambil data dalam bentuk tabel (misalkan dari website tertentu), untuk kebutuhan pengolahan lebih lanjut.
Pada tutorial ini kita akan membahas mengenai reformat/reshape dataframe pandas dari format long menjadi format wide. Untuk tutorial reformat dataframe dari wide menjadi long, lihat di sini.
Reformat/Reshape data Long to Wide
Merubah format dataframe dari long menjadi wide pada pandas dataframe dapat dilakukan menggunakan method pivot
. Secara umum bentuknya adalah sebagai berikut:
Python
df = pd.pivot(df, index='index', columns='newcols', values='val')
Pada contoh tersebut, index
menyatakan kolom yang dijadikan sebagai identitas. Selanjutnya, parameter columns
yaitu newcols
adalah kolom yang akan kita ubah menjadi kolom-kolom baru. Parameter values
yaitu val
menunjukkan kolom yang isiannya akan menjadi nilai bagi kolom-kolom baru tersebut.
Ilustrasi
Misalkan terdapat data pertumbuhan ekonomi dari tahun 2019-2021 untuk 4 provinsi A, B, C, dan D dalam format long. Data tersebut akan kita reformat menjadi data wide seperti gambar berikut ini:
Melakukan reformat seperti di atas dapat menggunakan sintaks berikut ini:
Python
import pandas as pd # Membuat contoh dataframe dalam format long df_long = pd.DataFrame({ 'Provinsi' : ["A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D", "D"], 'Tahun' : ["2019", "2020", "2021", "2019", "2020", "2021", "2019", "2020", "2021", "2019", "2020", "2021"], 'Growth' : [3.6, 5.1, 4.7, 2.8, 4.4, 3.9, 6.1, 4.8, 4.2, 2.9, 4.7, 3.4] }) # Menampilkan df_long print(df_long) # Reformat df_long menjadi wide df_wide = pd.pivot(df_long, index='Provinsi', columns='Tahun', values='Growth') # Menampilkan df_wide print(df_wide)
Output
# Output df_long Provinsi Tahun Growth 0 A 2019 3.6 1 A 2020 5.1 2 A 2021 4.7 3 B 2019 2.8 4 B 2020 4.4 5 B 2021 3.9 6 C 2019 6.1 7 C 2020 4.8 8 C 2021 4.2 9 D 2019 2.9 10 D 2020 4.7 11 D 2021 3.4 # Output df_wide Tahun 2019 2020 2021 Provinsi A 3.6 5.1 4.7 B 2.8 4.4 3.9 C 6.1 4.8 4.2 D 2.9 4.7 3.4
Pada contoh ini kita menggunakan kolom Provinsi
sebagai identitas. Kolom Tahun
yang sebelumnya berisi nilai 2019, 2020 dan 2021 kita reformat menjadi kolom-kolom yang terpisah dimana setiap kolom tersebut akan berisi nilai dari kolom Growth
untuk baris dan kolom yang bersesuaian.
Dengan cara yang serupa kita dapat membuat format wide dimana kolom Tahun
menjadi identitas dan kolom Provinsi
yang akan kita jadikan kolom-kolom baru.
Python
# Reformat df_long menjadi wide df_wide = pd.pivot(df_long, index='Tahun', columns='Provinsi', values='Growth') # Menampilkan df_wide print(df_wide)
Output
# Output df_wide Provinsi A B C D Tahun 2019 3.6 2.8 6.1 2.9 2020 5.1 4.4 4.8 4.7 2021 4.7 3.9 4.2 3.4
Kita dapat melakukan reformat dengan menggunakan lebih dari satu kolom. Misalkan dari data yang ada, selain memiliki kolom Tahun
, juga memiliki kolom Semester
. Selanjutnya ingin membuat format data menjadi wide dimana pada sisi kolom terdapat data untuk setiap tahun serta dibagi lagi berdasarkan kolom semester.
Untuk menghasilkan format seperti pada gambar di atas, berikut ini contoh sintaks yang dapat digunakan.
Python
# Membuat contoh dataframe dalam format long df_long = pd.DataFrame({ 'Provinsi' : ["A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C" ], 'Tahun' : ["2019", "2019", "2020", "2020", "2021", "2021", "2019", "2019", "2020", "2020", "2021", "2021", "2019", "2019", "2020", "2020", "2021", "2021" ], 'Semester' : [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], 'Growth' : [3.1, 4.1, 4.3, 2.7, 4.5, 3.4, 4.7, 2.4, 4.4, 3.9, 3.2, 5.4, 3.7, 3.9, 4.5, 3.8, 4.1, 2.3] }) # Reformat df_long menjadi wide df_wide = pd.pivot(df_long, index='Provinsi', columns=['Tahun', 'Semester'], values='Growth')
Informasi lainnya yang berkaitan dengan method pivot
dapat dilihat melalui dokumentasi pandas
di sini.
Selain merubah format data dari long menjadi wide, kita dapat pula melakukan sebaliknya. Misalkan kita memiliki data dalam format wide dan akan dirubah menjadi long.