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.





