<jupyter_start><jupyter_text>Dataframe Manipulation Using Pandas---<jupyter_code>import pandas as pd
import numpy as np
df = pd.read_csv('data/cereal_imputed.csv', index_col='name')
df.head()<jupyter_output><empty_output><jupyter_text>Filtering conditional formating sama seperti banyak bahasa pemrograman menggunakan operasi aritmatika dan perbandingan (+, -, /, x) (, ==, |, ~) etc<jupyter_code>df[df.rating > 70]
# menampilkan cereal dengan rating diatas 70
df[~(df.shelf == 1)]
# menampilkan shelf  bernilai selain 1 karena ada tanda negasi yang berarti selain
# menampilkan beberapa kondisi filtering sekaligus menggunakan (&)
# & akan menampilkan hasil yang memenuhi dua kondisi
df[(df.rating > 50) & (df.fat == 0)]
# menampilkan beberapa kondisi filtering sekaligus menggunakan (|) artinya atau
# & akan menampilkan hasil yang memenuhi salah satu kondisi atau dua kondisi
df[(df.rating > 70) | (df.vitamins == "FDA_100")]
df[df.mfr.isin(['K', 'N']) & (df.rating > 70)]

# isin digunakan untuk menampilkan salah satu atau beberapa kategori dari suatu kolom
# membuat result agar tidak mempengaruhi dataframe raw / asli bisa menggunakan .copy()

df_my_preferences = df[(df.rating > 60) & (df.mfr.isin(['K', 'N']))].copy()
df_my_preferences<jupyter_output><empty_output><jupyter_text>Sorting<jupyter_code># sorting / mengurutkan berdasarkan kolom tertentu

df_my_preferences.sort_values('rating')

# akan mengurutkan dari kecil ke besar (Ascending)
df_my_preferences.sort_values('rating', ascending=False)

# akan mengurutkan dari besar ke kecil (Descending)
df_my_preferences.sort_values('rating', ascending=False, inplace=True)
df_my_preferences
# gunakan parameter inplace=True untuk membuat perubahan ke data asli<jupyter_output><empty_output><jupyter_text>Grouping and Aggregate<jupyter_code>df.groupby("shelf").mean()

# digroup berdasarkan kategori yang ada di kolom shelf dan kolom lain diaggregate berdasarkan mean atau di rata-rata
# kolom yang lain yang tidak berbentuk numerik tidak bisa diagregate dan tidak akan ditampilkan
# groupby lebih dari satu kolom

df.groupby(['mfr', 'shelf']).mean()

# akan digrouping berdasarkan kategori yang ada di kolom mfr dan shelf
df.groupby(['mfr', 'shelf']).count()

# groupby lebih dari satu kolom dan agregate berdasarkan hitung
df.groupby(['mfr', 'shelf']).size()

# melihat jumlah secara keseluruhan
# pivot table

df.pivot_table(index='mfr', columns='vitamins', values='rating', aggfunc='mean')<jupyter_output><empty_output><jupyter_text>New Column and Drop Column<jupyter_code>df["kolom_baru"] = np.random.rand(len(df))
df.head()

# mnambah kolom baru sebanyak panjang data di dataframe
df.drop(columns="kolom_baru", inplace=True)
df.head()<jupyter_output><empty_output><jupyter_text>Map, Apply, dan Transform  MAP<jupyter_code>df['shelf_name'] = df.shelf.map({1:"bawah" , 2:"tengah" , 3:"atas"})
df.head()

# membuat kolom baru dan memasukan nilai baru dan dipetakan berdasarkan koom tertentu 
df.shelf = df.shelf.map({1:"bawah" , 2:"tengah" , 3:"atas"})
df.head()

# membuat kolom baru dan menimpa kolom lama dengan nilai baru dan dipetakan berdasarkan koom tertentu<jupyter_output><empty_output><jupyter_text>Apply<jupyter_code>def convert_g_to_mg(x):
    return 1000*x

def convert_to_lower(x):
    return x.lower()
df['fat_mg'] = df.fat.apply(convert_g_to_mg)
df.head()
df['mfr_lower'] = df.mfr.apply(convert_to_lower)
df.head()
df['protein_mg'] = df.protein.apply(lambda x: x*1000)
df.head()

# menggunakan fungsi sekali pakai (disposable) menggunakan lambda function<jupyter_output><empty_output><jupyter_text>Transform<jupyter_code>df['scaled_rating'] = df.rating.transform(lambda x: (x-x.min())/(x.max()-x.min()))
df.head()

# scaling minmax cara manual
df.drop(columns=['shelf_name', 'fat_mg', 'mfr_lower', 'protein_mg', 'scaled_rating'], inplace=True)
df.head()<jupyter_output><empty_output><jupyter_text>ENCODING DAN BINNING konsep encodingmengubah data kategorikal (tipe data object/string) pada suatu kolom menjadi numerikal (angka)label encoding / ordinal encoding pada dasarnya sama seperti pada maping yang telah dilakukan sebelumnya, umumnya dilakukan apabila kolom ketegorikal yang berbentuk binary (dua pilihan). kita mengkodifikasi objek menjadi numerikal valuebila lebih dari dua kategori umumnya menggunakan one hot encoding atau dummy variabel/ one hot encoding. akan dibagi menjadi kolom-kolom baru berdasarkan kategori  ONE HOT ENCODING / DUMMY VARIABLE<jupyter_code>pd.get_dummies(df, columns=['vitamins'])

# kategori pada kolom vitamins akan dibelah dqan dibuat menjadi kolom baru terpisah<jupyter_output><empty_output><jupyter_text>Binning mengubah data numerik menjadi kategori, misal data numerik akan dikelompokan berdasarkan interval tertentu dan menjadi beberapa grupcontoh :- 0-5 = balita- 5-10 = anak-anak- 10-18 = remaja<jupyter_code>df.sodium.hist(bins=10)
df['sodium_bin'] = pd.cut(df.sodium, bins=3, labels=['low', 'medium', 'high'])
df.head()

# membagi kolom sodium menjadi 3 kategori low, medium, dan high
df['sodium_bin'] = pd.cut(df.sodium, bins=[0, 100, 200, df.sodium.max()], labels=['0-100', '100-200', '>200'])
df.head()

# membagi berdasarkan angka interval yang kita tentukan
# 0-100
# 100-200
# 200-max
df.rating.hist(bins=50)
df['Grade'] = pd.cut(df.rating, bins=[0, 40, 70, df.rating.max()], labels=['C', 'B', 'A'])
df.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12271880819366852, 'fraction_numerical': 0.015828677839851025, 'mean_word_length': 6.661911554921541, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 47, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '383565', 'license': 'MIT', 'n_tokens_mistral': 2267, 'n_tokens_neox': 2098, 'n_words': 485, 'path': '02 - Pandas Introduction/Dataframe Manipulation Using Pandas.ipynb', 'repo_name': 'diazers/Machine_Learning', 'size': '5370'}