<jupyter_start><jupyter_text>Pandas (Parte 3)<jupyter_code>import pandas as pd
import numpy as np
locacion_datos = "https://otorongo.club/2021/json/ingresos/"

cong = pd.read_json(locacion_datos)
cong_1 = cong[['dni', 'total_ingreso']]

cong_2 = cong[['dni', 'partido']]

solo_vn = cong_2.loc[cong_2['partido'] == 'VICTORIA NACIONAL', :]<jupyter_output><empty_output><jupyter_text>Cómo es un outer merge?<jupyter_code>resultado_merge_vn = pd.merge(cong_1,
                     solo_vn,
                    left_on = 'dni',
                    right_on = 'dni',
                    how = 'outer')

resultado_merge_vn
#resultado_merge_vn.loc[resultado_merge_vn['partido'] != 'VICTORIA NACIONAL']
#resultado_merge_vn.loc[resultado_merge_vn['partido'] == 'VICTORIA NACIONAL']<jupyter_output><empty_output><jupyter_text>Cómo es un left merge? Y un right merge?<jupyter_code>resultado_merge_vn = pd.merge(cong_1,
                     solo_vn,
                    left_on = 'dni',
                    right_on = 'dni',
                    how = 'left')
#                    how = 'right')

resultado_merge_vn<jupyter_output><empty_output><jupyter_text>Uniendo varias bases de datos verticalmente (append)En pandas, este método se llama concat.<jupyter_code>df_partidos = {}
for cat in cong['partido'].unique():
    df = cong.loc[cong['partido'] == cat]
    df_partidos[cat] = df
df_fp = df_partidos['FUERZA POPULAR']
df_vn = df_partidos['VICTORIA NACIONAL']
df_append = pd.concat([df_vn,df_fp])
#df_append
df_append = pd.concat([df_partidos['FUERZA POPULAR'], df_partidos['VICTORIA NACIONAL']])<jupyter_output><empty_output><jupyter_text>Limpieza de datos (parte 2) Eliminando columnas<jupyter_code>#Creando (y eliminando) una columna que refleja un mal cálculo
cong['calculo_mal_hecho'] = cong.eval('ingreso_publico + ingreso_privado')
cong.drop(columns = 'calculo_mal_hecho', inplace = True)<jupyter_output><empty_output><jupyter_text>Identificando (y eliminando) duplicados:<jupyter_code>nueva_df = pd.concat([cong, cong])
nueva_df.head(5)
nueva_df.nunique()
nueva_df.nunique(dropna=False)
## Cuales son las dimensiones de nuestra dataframe si eliminamos las observaciones duplicadas
nueva_df.drop_duplicates().shape
nueva_df.shape
sin_duplicados = nueva_df.drop_duplicates(subset='dni')
sin_duplicados.head(5)
sin_duplicados_2 = nueva_df.drop_duplicates(subset=['dni','partido'])<jupyter_output><empty_output><jupyter_text>Manejando valores perdidos (missing)A continuación veremos cómo manejar valores perdidos (missing). Veremos 3 métodos en especial:- ` isna`- `dropna`- `fillna`<jupyter_code>cong_m = cong.copy(deep = True)
cong_m.replace({0:np.nan}, inplace = True)
cong_m.isna().head(5)
cong_m.isna().sum()
cong_m.isna().mean().round(4)*100
## Aquí vemos cuales observaciones se eliminarían 
cong_m.dropna().shape
cong_m.dropna(subset=['ingreso_publico', 'ingreso_privado']).shape
#cong_m.fillna('hola')
dict_fill = {'total_ingreso': 0, 'ingreso_publico': 'hola'}
#cong_m.fillna(dict_fill)
med_fill = cong_m.median(numeric_only=True)
med_fill
med_fill = cong_m.median(numeric_only=True)

cong_m.fillna(med_fill)<jupyter_output><empty_output><jupyter_text>Haciendo un reshape de los datos (volver los datos de wide a long, y viceversa).<jupyter_code>categ_labels = ['cat_1', 'cat_2', 'cat_3', 'cat_4']
categ_bins = [-1, 10000, 50000, 100000, 200000000]
cong['cat_ingreso'] = pd.cut(cong['total_ingreso'],
                              bins = categ_bins, labels = categ_labels)


resumen = cong.pivot_table(index='partido', columns='cat_ingreso', values='total_ingreso', aggfunc='mean')
resumen.columns = resumen.columns.astype(str) ### Tengo que convertir mis columnas, que eran "Categorical indexes" en strings (no siempre pasara esto, suele estar en string )
#resumen['total'] =resumen.sum(axis=1)
resumen = resumen.reset_index()
resumen_melted = resumen.melt(id_vars = 'partido', value_vars = ['cat_1', 'cat_2', 'cat_3', 'cat_4'])
resumen_melted<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13391959798994976, 'fraction_numerical': 0.01457286432160804, 'mean_word_length': 5.515548281505728, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 0, '>': 33, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '598996', 'license': 'MIT', 'n_tokens_mistral': 1603, 'n_tokens_neox': 1527, 'n_words': 264, 'path': 'Semana 8/Pandas_iii.ipynb', 'repo_name': 'sonn498/actividades_en_ccss', 'size': '3980'}