Limpieza de dataset de Características de las localidades y del entorno urbano 2014

1. Introduccion

Indicadores que salen de deste dataset:

ID Descripción
P0702 Restricción al paso de automóviles
P0703 Restricción al paso a peatones
P0704 Vialidades con recubrimiento de la calle
P0705 Vialidades con banqueta
P0706 Vialidades con guarnición
P0713 vialidades con rampa para silla de ruedas

In [2]:
descripciones = {
'P0702' : 'Restricción al paso de automóviles',
'P0703' : 'Restricción al paso a peatones',
'P0704' : 'Vialidades con recubrimiento de la calle',
'P0705' : 'Vialidades con banqueta',
'P0706' : 'Vialidades con guarnición',
'P0713' : 'vialidades con rampa para silla de ruedas',
}

In [3]:
# Librerias utilizadas
import pandas as pd
import sys
import urllib
import os
import csv
import zipfile

In [4]:
# Configuracion del sistema
print('Python {} on {}'.format(sys.version, sys.platform))
print('Pandas version: {}'.format(pd.__version__))
import platform; print('Running on {} {}'.format(platform.system(), platform.release()))


Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)] on win32
Pandas version: 0.20.1
Running on Windows 8.1

In [5]:
# URL Fuente
remote_path = r'http://www.beta.inegi.org.mx/contenidos/proyectos/encotras/cleu/2014/tabulados/tab_entorno_2014_xls.zip'

# Carpeta destino Local
local_path = r'D:\PCCS\00_RawData\01_CSV\CLEU\tab_entorno_2014_xls.zip'

Descarga de datos

Todos los datos se encuentran en un solo archivo


In [7]:
# Descarga de archivo
if os.path.isfile(local_path):
    print('Ya existe el archivo: {}'.format(local_path))
else:
    print('Descargando {} ... ... ... ... ... '.format(local_path))
    urllib.request.urlretrieve(remote_path, local_path) #
    print('se descargó {}'.format(local_path))


Ya existe el archivo: D:\PCCS\00_RawData\01_CSV\CLEU\tab_entorno_2014_xls.zip

In [13]:
#Descompresión de archivo
target = r'D:\PCCS\00_RawData\01_CSV\CLEU'
archivo = target + '\\' + 'tab_entorno_2014.xls'

if os.path.isfile(target + '\\' + 'tab_entorno_2014.xls'):
    print('Ya existe el archivo: {}'.format(archivo))
else:
    print('Descomprimiendo {} ... ... ... ... ... '.format(target))
    descomprimir = zipfile.ZipFile(local_path, 'r')
    descomprimir.extractall(target)
    descomprimir.close


Ya existe el archivo: D:\PCCS\00_RawData\01_CSV\CLEU\tab_entorno_2014.xls

Estandarizacion del dataset


In [15]:
# Cada parametro se encuentra en una hoja diferente del libro de excel
# Ubicacion de datos del cada parametro:
hojas = {
    'P0702': 'TEU07', # Restricción al paso de automóviles
    'P0703': 'TEU07', # Restricción al paso a peatones
    'P0704': 'TEU12', # Vialidades con recubrimiento de la calle
    'P0705': 'TEU02', # Vialidades con banqueta
    'P0706': 'TEU03', # Vialidades con guarnición
    'P0713': 'TEU04' # vialidades con rampa para silla de ruedas
}

Cada hoja tiene columnas diferentes, a continuación se definen para pasar los nombres durante el proceso de lectura de hojas:


In [19]:
# Nombre de las hojas a partir de su descripcion en el archivo fuente
nom_hojas = {
    'P0702': 'Manzanas por entidad federativa, municipio, localidad y restricción del paso a automóviles según restricción del paso a peatones en sus vialidades', # Restricción al paso de automóviles
    'P0703': 'Manzanas por entidad federativa, municipio, localidad y restricción del paso a automóviles según restricción del paso a peatones en sus vialidades', # Restricción al paso a peatones
    'P0704': 'Vialidades por entidad federativa, municipio, localidad y alumbrado público según tipo de recubrimiento de la calle', # Vialidades con recubrimiento de la calle
    'P0705': 'Manzanas por entidad federativa, municipio, localidad y disponibilidad de banqueta según disponibilidad de recubrimiento de la calle', # Vialidades con banqueta
    'P0706': 'Manzanas por entidad federativa, municipio, localidad y disponibilidad de banqueta según disponibilidad de guarnición en sus vialidades', # Vialidades con guarnición
    'P0713': 'Manzanas por entidad federativa, municipio, localidad y disponibilidad de banqueta según disponibilidad de rampa para silla de ruedas en sus vialidades' # vialidades con rampa para silla de ruedas
}

Debido a que se saltarán renglones al momento de leer cada hoja, será necesario renombrar todas las columnas para cada hoja. De una vez, como en el archivo original todas las columnas tienen nombres similares sin imporatar el tema, en el renombrado de columnas se incluirá el tema al que aluda cada dataset.


In [40]:
dic_hojas = {
    'TEU07': [     # Restricción al paso de automóviles
        'Clave geoestadística',
        'Entidad federativa',
        'Municipio',
        'Localidad',
        'Restricción del paso a automóviles',
        'Total de manzanas',
        'RPPeatones Todas las vialidades',
        'RPPeatones Alguna vialidad',
        'RPPeatones Ninguna vialidad',
        'RPPeatones No especificado'
    ],
    'TEU12': [     # Vialidades con recubrimiento de la calle
        'Clave geoestadística',
        'Entidad federativa',
        'Municipio',
        'Localidad',
        'Disponibilidad de alumbrado público',
        'Total de vialidades',
        'Pavimento o concreto',
        'Empedrado o adoquín',
        'Sin recubrimiento',
        'Recubrimiento No especificado',
    ], 
    'TEU02': [     # Vialidades con banqueta
        'Clave geoestadística',
        'Entidad federativa',
        'Municipio',
        'Localidad',
        'Disponibilidad de banqueta',
        'Total de manzanas',
        'Banqueta en todas las vialidades',
        'Banqueta en Alguna vialidad',
        'Banqueta en Ninguna vialidad',
        'Banqueta No especificado'
    ], 
    'TEU03': [     # Vialidades con guarnición
        'Clave geoestadística',
        'Entidad federativa',
        'Municipio',
        'Localidad',
        'Disponibilidad de banqueta',
        'Total de manzanas',
        'Guarnicion en Todas las vialidades',
        'Guarnicion en Alguna vialidad',
        'Guarnicion en Ninguna vialidad',
        'Guarnicion No especificado'
    ],
    'TEU04': [     # vialidades con rampa para silla de ruedas
        'Clave geoestadística',
        'Entidad federativa',
        'Municipio',
        'Localidad',
        'Disponibilidad de banqueta',
        'Total de manzanas',
        'Rampa en Todas las vialidades',
        'Rampa en Alguna vialidad',
        'Rampa en Ninguna vialidad',
        'Rampa No especificado'
    ]
}

In [23]:
# Numero de filas que se tienen que ignorar en cada hoja antes de llegar a los datos.
skip = 8

In [41]:
# Funcion para leer datos de hojas
def cargahoja(hoja, colnames, skip):
    raw_data = pd.read_excel(archivo,
                              sheetname=hoja,
                              skiprows=skip).dropna()
    # renombra las columnas
    raw_data.columns = colnames
    return raw_data

In [77]:
datasets = {}
for parametro, hoja in hojas.items():
    print('Procesando {} para {}'.format(hoja, parametro))
    datasets[parametro] = cargahoja(hoja, dic_hojas[hoja], skip)
    print('------terminado------')


Procesando TEU07 para P0702
------terminado------
Procesando TEU07 para P0703
------terminado------
Procesando TEU12 para P0704
------terminado------
Procesando TEU02 para P0705
------terminado------
Procesando TEU03 para P0706
------terminado------
Procesando TEU04 para P0713
------terminado------

In [51]:
datasets.keys()


Out[51]:
dict_keys(['P0702', 'P0703', 'P0704', 'P0705', 'P0706', 'P0713'])

In [49]:
descripciones


Out[49]:
{'P0702': 'Restricción al paso de automóviles',
 'P0703': 'Restricción al paso a peatones',
 'P0704': 'Vialidades con recubrimiento de la calle',
 'P0705': 'Vialidades con banqueta',
 'P0706': 'Vialidades con guarnición',
 'P0713': 'vialidades con rampa para silla de ruedas'}

Limpieza de datasets

Hay algunos procesos estandar que se aplican a todos los dataset


In [73]:
# Limpieza estándar
def limpieza(dataset):
    # Conserva unicamente los renglones con datos municipales
    dataset = dataset[dataset['Clave geoestadística'].str.len() == 5]
    
    # Elimina columnas que ya no se van a utilizar
    del(dataset['Entidad federativa'])
    del(dataset['Municipio'])
    del(dataset['Localidad'])
    
    # Renombra la columna correspondiente a CVE_MUN y asignala como index
    dataset.set_index('Clave geoestadística', inplace=True)
    dataset = dataset.rename_axis('CVE_MUN')
    
    return dataset

In [64]:
# Metadatos estándar
metadatos = {
    'Nombre del Dataset': 'Características de las localidades y del entorno urbano 2014',
    'Descripcion del dataset': None,
    'Disponibilidad Temporal': '2014',
    'Periodo de actualizacion': 'No Determinada',
    'Nivel de Desagregacion': 'Localidad, Municipal, Estatal, Nacional',
    'Notas': None,
    'Fuente': 'INEGI',
    'URL_Fuente': 'http://www.beta.inegi.org.mx/proyectos/encotras/cleu/2014/',
    'Dataset base': None,
}

In [67]:
list(datasets.keys())


Out[67]:
['P0702', 'P0703', 'P0704', 'P0705', 'P0706', 'P0713']

In [78]:
datasets['P0702'].head(3)


Out[78]:
Clave geoestadística Entidad federativa Municipio Localidad Restricción del paso a automóviles Total de manzanas RPPeatones Todas las vialidades RPPeatones Alguna vialidad RPPeatones Ninguna vialidad RPPeatones No especificado
1 00 Estados Unidos Mexicanos Total Total Total 1329936.0 11211.0 48629.0 1228386.0 41710.0
2 00 Estados Unidos Mexicanos Total Total Restricción del paso a automóviles en todas la... 17362.0 9849.0 601.0 6902.0 10.0
3 00 Estados Unidos Mexicanos Total Total Restricción del paso a automóviles en alguna v... 157433.0 286.0 42607.0 114519.0 21.0

In [79]:
# Limpieza estándar inicial
for ds in list(datasets.keys()):
    print('Limpiando dataset para {}'.format(ds))
    datasets[ds] = limpieza(datasets[ds])
    print('------terminado------')


Limpiando dataset para P0702
------terminado------
Limpiando dataset para P0703
------terminado------
Limpiando dataset para P0704
------terminado------
Limpiando dataset para P0705
------terminado------
Limpiando dataset para P0706
------terminado------
Limpiando dataset para P0713
------terminado------

In [93]:
datasets['P0702'].head()


Out[93]:
Restricción del paso a automóviles Total de manzanas RPPeatones Todas las vialidades RPPeatones Alguna vialidad RPPeatones Ninguna vialidad RPPeatones No especificado
CVE_MUN
01001 Total 9419.0 278.0 553.0 8397.0 191.0
01001 Restricción del paso a automóviles en todas la... 305.0 257.0 5.0 43.0 0.0
01001 Restricción del paso a automóviles en alguna v... 1079.0 4.0 504.0 571.0 0.0
01001 Restricción del paso a automóviles en ninguna ... 7599.0 5.0 40.0 7554.0 0.0
01001 No especificado 436.0 12.0 4.0 229.0 191.0

Limpieza de dataset para P0702: Restricción al paso de automóviles


In [164]:
# La columna 'Restricción del paso a automóviles' clasifica las manzanas
# que tienen alguna clase de restriccion al paso de automóviles.
P0702_raw = datasets['P0702']
list(P0702_raw['Restricción del paso a automóviles'].unique())


Out[164]:
['Total',
 'Restricción del paso a automóviles en todas las vialidades',
 'Restricción del paso a automóviles en alguna vialidad',
 'Restricción del paso a automóviles en ninguna vialidad',
 'No especificado']

In [165]:
P0702_raw.head()


Out[165]:
Restricción del paso a automóviles Total de manzanas RPPeatones Todas las vialidades RPPeatones Alguna vialidad RPPeatones Ninguna vialidad RPPeatones No especificado
CVE_MUN
01001 Total 9419.0 278.0 553.0 8397.0 191.0
01001 Restricción del paso a automóviles en todas la... 305.0 257.0 5.0 43.0 0.0
01001 Restricción del paso a automóviles en alguna v... 1079.0 4.0 504.0 571.0 0.0
01001 Restricción del paso a automóviles en ninguna ... 7599.0 5.0 40.0 7554.0 0.0
01001 No especificado 436.0 12.0 4.0 229.0 191.0

In [166]:
list(P0702_raw)


Out[166]:
['Restricción del paso a automóviles',
 'Total de manzanas',
 'RPPeatones Todas las vialidades',
 'RPPeatones Alguna vialidad',
 'RPPeatones Ninguna vialidad',
 'RPPeatones No especificado']

In [167]:
# Es conveniente crear un dataset con el total de manzanas por municipio
manzanas = P0702_raw[P0702_raw['Restricción del paso a automóviles'] == 'Total']['Total de manzanas']
manzanas.head()


Out[167]:
CVE_MUN
01001    9419.0
01002     140.0
01003     585.0
01004     144.0
01005    1195.0
Name: Total de manzanas, dtype: float64

In [168]:
# Para el parametro, hay que filtrar unicamente las columnas que contienen restricciones a la vialidad
P0702_1 = P0702_raw.loc[P0702_raw['Restricción del paso a automóviles'].isin([
    'Restricción del paso a automóviles en todas las vialidades',
    'Restricción del paso a automóviles en alguna vialidad',
])]
P0702_1.head()


Out[168]:
Restricción del paso a automóviles Total de manzanas RPPeatones Todas las vialidades RPPeatones Alguna vialidad RPPeatones Ninguna vialidad RPPeatones No especificado
CVE_MUN
01001 Restricción del paso a automóviles en todas la... 305.0 257.0 5.0 43.0 0.0
01001 Restricción del paso a automóviles en alguna v... 1079.0 4.0 504.0 571.0 0.0
01002 Restricción del paso a automóviles en alguna v... 6.0 0.0 2.0 4.0 0.0
01003 Restricción del paso a automóviles en todas la... 1.0 0.0 0.0 1.0 0.0
01003 Restricción del paso a automóviles en alguna v... 114.0 0.0 9.0 105.0 0.0

In [169]:
# Una vez filtrados hay que agregar los datos por municipio. También vale la pena quitar las columnas de 
# restriccion al paso de peatones, pues no son de interes para este parametro.
P0702_1 = P0702_1['Total de manzanas'].groupby(level=0).sum().to_frame(name='Restricción del paso a automóviles')
P0702_1.head()


Out[169]:
Restricción del paso a automóviles
CVE_MUN
01001 1384.0
01002 6.0
01003 115.0
01004 1.0
01005 132.0

In [170]:
# Unimos ambos datasets para crear el dataset estandar del parámetro
P0702 = manzanas.to_frame().join(P0702_1)
print(len(P0702))
P0702.head()


1798
Out[170]:
Total de manzanas Restricción del paso a automóviles
CVE_MUN
01001 9419.0 1384.0
01002 140.0 6.0
01003 585.0 115.0
01004 144.0 1.0
01005 1195.0 132.0

Después de hacer el join de las columnas del total de manzanas y las manzanas con restricción al paso de automóviles, en algunas celdas de la columna "Restricción del paso a automóviles" quedaron sin valores. Para entender a qué se debe, es conveniente agregar las columnas de 'Restricción del paso a automóviles en ninguna vialidad' y 'No Especificado'.


In [171]:
# celdas de la columna "Restricción del paso a automóviles" que quedaron sin valores
P0702[P0702['Restricción del paso a automóviles'].isnull()]


Out[171]:
Total de manzanas Restricción del paso a automóviles
CVE_MUN
04007 86.0 NaN
05023 190.0 NaN
05036 81.0 NaN
05037 357.0 NaN
06006 99.0 NaN
07016 149.0 NaN
07023 77.0 NaN
07025 71.0 NaN
07026 97.0 NaN
07035 82.0 NaN
07043 105.0 NaN
07058 105.0 NaN
07080 63.0 NaN
07085 92.0 NaN
07090 31.0 NaN
07100 88.0 NaN
07103 98.0 NaN
07104 258.0 NaN
07110 104.0 NaN
07117 72.0 NaN
07118 35.0 NaN
07119 10.0 NaN
08005 578.0 NaN
08016 195.0 NaN
08024 194.0 NaN
08038 106.0 NaN
08039 106.0 NaN
08043 127.0 NaN
08044 265.0 NaN
08058 47.0 NaN
... ... ...
31034 87.0 NaN
31035 115.0 NaN
31039 75.0 NaN
31042 161.0 NaN
31046 120.0 NaN
31049 94.0 NaN
31055 108.0 NaN
31057 113.0 NaN
31061 43.0 NaN
31062 79.0 NaN
31063 64.0 NaN
31066 84.0 NaN
31074 53.0 NaN
31077 79.0 NaN
31078 167.0 NaN
31082 96.0 NaN
31090 64.0 NaN
31094 81.0 NaN
31095 55.0 NaN
31097 103.0 NaN
31099 78.0 NaN
31103 83.0 NaN
31105 92.0 NaN
32004 120.0 NaN
32016 172.0 NaN
32018 108.0 NaN
32028 68.0 NaN
32033 87.0 NaN
32045 202.0 NaN
32047 134.0 NaN

303 rows × 2 columns


In [172]:
P0702_raw['Restricción del paso a automóviles'].unique()


Out[172]:
array(['Total',
       'Restricción del paso a automóviles en todas las vialidades',
       'Restricción del paso a automóviles en alguna vialidad',
       'Restricción del paso a automóviles en ninguna vialidad',
       'No especificado'], dtype=object)

In [173]:
# Columna con manzanas con restriccion al paso de automoviles en ninguna vialidad
RPA = 'Restricción del paso a automóviles'
TM = 'Total de manzanas'
VAR = 'Restricción del paso a automóviles en ninguna vialidad'
RPANV = P0702_raw[P0702_raw[RPA] == VAR][TM].to_frame(name = VAR)
RPANV.head()


Out[173]:
Restricción del paso a automóviles en ninguna vialidad
CVE_MUN
01001 7599.0
01002 134.0
01003 470.0
01004 143.0
01005 1031.0

In [174]:
# Columna con manzanas con restriccion al paso de automoviles no especificado
VAR = 'No especificado'
RPANE = P0702_raw[P0702_raw[RPA] == VAR][TM].to_frame(name = 'Restricción del paso a automóviles '+VAR)
RPANE.head()


Out[174]:
Restricción del paso a automóviles No especificado
CVE_MUN
01001 436.0
01005 32.0
01006 21.0
01007 14.0
01009 2.0

In [175]:
# Union de los dataframes
P0702 = P0702.join(RPANV)
P0702 = P0702.join(RPANE)
P0702.head()


Out[175]:
Total de manzanas Restricción del paso a automóviles Restricción del paso a automóviles en ninguna vialidad Restricción del paso a automóviles No especificado
CVE_MUN
01001 9419.0 1384.0 7599.0 436.0
01002 140.0 6.0 134.0 NaN
01003 585.0 115.0 470.0 NaN
01004 144.0 1.0 143.0 NaN
01005 1195.0 132.0 1031.0 32.0

Nuevamente, revisamos las celdas que no tienen datos en la columna de "Restriccion al paso de automóviles"


In [182]:
# Celdas de la columna "Restricción del paso a automóviles" que quedaron sin valores
P0702[P0702['Restricción del paso a automóviles'].isnull()].head()


Out[182]:
Total de manzanas Restricción del paso a automóviles Restricción del paso a automóviles en ninguna vialidad Restricción del paso a automóviles No especificado
CVE_MUN
04007 86.0 NaN 86.0 NaN
05023 190.0 NaN 190.0 NaN
05036 81.0 NaN 81.0 NaN
05037 357.0 NaN 337.0 20.0
06006 99.0 NaN 99.0 NaN

Hay dos tipos de casos:

  1. Renglones en donde la columna "Total de manzanas" es igual al numero de manzanas en la columna "Restricción del paso a automóviles en ninguna vialidad" (Por ejemplo, la CVE_MUN 04007). En estos renglones es seguro asumir que el valor de la columna "Restricción del paso a automóviles" es igual a cero.
  2. Renglones en donde la columna "Total de manzanas" no es igual al numero de manzanas en la columna "Restricción del paso a automóviles en ninguna vialidad", y la hay una cantidad definida de manzanas en la columna "Restricción del paso a automóviles No especificado". En estos renglones no se puede definir con certeza el valor de la columna "Restricción del paso a automóviles", por lo que se dejará vacío

In [ ]:


In [183]:
def llenarestriccion(x):
    rpa = 'Restricción del paso a automóviles'
    rpane = 'Restricción del paso a automóviles No especificado'
    if x[rpa].isnull() and x[rpane].isnull():
        x[rpa] = 0

In [185]:
testframe.apply(llenarestriccion)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   2433             try:
-> 2434                 return libts.get_value_box(s, key)
   2435             except IndexError:

pandas\_libs\tslib.pyx in pandas._libs.tslib.get_value_box (pandas\_libs\tslib.c:18843)()

pandas\_libs\tslib.pyx in pandas._libs.tslib.get_value_box (pandas\_libs\tslib.c:18477)()

TypeError: 'str' object cannot be interpreted as an integer

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-185-0089563b08c3> in <module>()
----> 1 testframe.apply(llenarestriccion)

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
   4358                         f, axis,
   4359                         reduce=reduce,
-> 4360                         ignore_failures=ignore_failures)
   4361             else:
   4362                 return self._apply_broadcast(f, axis)

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
   4454             try:
   4455                 for i, v in enumerate(series_gen):
-> 4456                     results[i] = func(v)
   4457                     keys.append(v.name)
   4458             except Exception as e:

<ipython-input-183-11e01b293059> in llenarestriccion(x)
      2     rpa = 'Restricción del paso a automóviles'
      3     rpane = 'Restricción del paso a automóviles No especificado'
----> 4     if x[rpa].isnull() and x[rpane].isnull():
      5         x[rpa] = 0

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    599         key = com._apply_if_callable(key, self)
    600         try:
--> 601             result = self.index.get_value(self, key)
    602 
    603             if not is_scalar(result):

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   2440                     raise InvalidIndexError(key)
   2441                 else:
-> 2442                     raise e1
   2443             except Exception:  # pragma: no cover
   2444                 raise e1

C:\Users\carlos.arana\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   2426         try:
   2427             return self._engine.get_value(s, k,
-> 2428                                           tz=getattr(series.dtype, 'tz', None))
   2429         except KeyError as e1:
   2430             if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value (pandas\_libs\index.c:4363)()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value (pandas\_libs\index.c:4046)()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas\_libs\index.c:5085)()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas\_libs\hashtable.c:20405)()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas\_libs\hashtable.c:20359)()

KeyError: ('Restricción del paso a automóviles', 'occurred at index Total de manzanas')

In [ ]:
# Guardar el dataset
file = r'D:\PCCS\01_Dmine\Datasets\CLEU\P0702.xlsx'
writer = pd.ExcelWriter(file)
P0702.to_excel(writer, sheet_name = 'DATOS')
variables.to_excel(writer, sheet_name = 'VARIABLES')
writer.save()
print('---------------TERMINADO---------------')