Conversión de formatos usando Pandas — 11:28 min
11:28 min | Última modificación: Octubre 13, 2021 | YouTube
Una tarea común que se da en la práctica es convertir una tabla de datos de un formato a otro. Pandas posee herramientas que permiten realizar esta conversión de forma directa.
Al finalizar el documento, usted estará en capacidad de leer y escribir tablas en los siguientes formatos:
CSV.
JSON.
Pickle.
Ancho fijo.
HTML.
Microsoft Excel.
HDF5.
Stata.
Matlab y Octave.
Preparación
[1]:
import numpy as np
import pandas as pd
pd.set_option("display.notebook_repr_html", False)
Creación de una tabla de ejemplo
[2]:
df = pd.DataFrame(
{
"index": list(range(1, 6)),
"name": ["A", "B", "C", "D", "E"],
"value": [3.03, 5.14, 0.40, 1.13, 8.25],
}
)
df
[2]:
index name value
0 1 A 3.03
1 2 B 5.14
2 3 C 0.40
3 4 D 1.13
4 5 E 8.25
Almacenamiento del archivo en disco
[3]:
df.to_csv(
"/tmp/data.csv",
index=False,
)
!cat /tmp/data.csv
index,name,value
1,A,3.03
2,B,5.14
3,C,0.4
4,D,1.13
5,E,8.25
Conversión de CSV a JSON
[4]:
#
# Conversión a JSON con la orientación por
# defecto ('columns')
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
)
!cat /tmp/data.json
{
"index":{
"0":1,
"1":2,
"2":3,
"3":4,
"4":5
},
"name":{
"0":"A",
"1":"B",
"2":"C",
"3":"D",
"4":"E"
},
"value":{
"0":3.03,
"1":5.14,
"2":0.4,
"3":1.13,
"4":8.25
}
}
[5]:
#
# Orientación: 'index'
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
orient='index',
)
!cat /tmp/data.json
{
"0":{
"index":1,
"name":"A",
"value":3.03
},
"1":{
"index":2,
"name":"B",
"value":5.14
},
"2":{
"index":3,
"name":"C",
"value":0.4
},
"3":{
"index":4,
"name":"D",
"value":1.13
},
"4":{
"index":5,
"name":"E",
"value":8.25
}
}
[6]:
#
# Orientación: 'split'
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
orient='split',
)
!cat /tmp/data.json
{
"columns":[
"index",
"name",
"value"
],
"index":[
0,
1,
2,
3,
4
],
"data":[
[
1,
"A",
3.03
],
[
2,
"B",
5.14
],
[
3,
"C",
0.4
],
[
4,
"D",
1.13
],
[
5,
"E",
8.25
]
]
}
[7]:
#
# Orientación: 'records'
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
orient='records',
)
!cat /tmp/data.json
[
{
"index":1,
"name":"A",
"value":3.03
},
{
"index":2,
"name":"B",
"value":5.14
},
{
"index":3,
"name":"C",
"value":0.4
},
{
"index":4,
"name":"D",
"value":1.13
},
{
"index":5,
"name":"E",
"value":8.25
}
]
[8]:
#
# Orientación: 'columns'
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
orient='columns',
)
!cat /tmp/data.json
{
"index":{
"0":1,
"1":2,
"2":3,
"3":4,
"4":5
},
"name":{
"0":"A",
"1":"B",
"2":"C",
"3":"D",
"4":"E"
},
"value":{
"0":3.03,
"1":5.14,
"2":0.4,
"3":1.13,
"4":8.25
}
}
[9]:
#
# Orientación: 'values'
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
orient='values',
)
!cat /tmp/data.json
[
[
1,
"A",
3.03
],
[
2,
"B",
5.14
],
[
3,
"C",
0.4
],
[
4,
"D",
1.13
],
[
5,
"E",
8.25
]
]
[10]:
#
# Orientación: 'table'
#
pd.read_csv("/tmp/data.csv").to_json(
"/tmp/data.json",
indent=True,
orient='table',
)
!cat /tmp/data.json
{
"schema":{
"fields":[
{
"name":"index",
"type":"integer"
},
{
"name":"index",
"type":"integer"
},
{
"name":"name",
"type":"string"
},
{
"name":"value",
"type":"number"
}
],
"primaryKey":[
"index"
],
"pandas_version":"0.20.0"
},
"data":[
{
"level_0":0,
"index":1,
"name":"A",
"value":3.03
},
{
"level_0":1,
"index":2,
"name":"B",
"value":5.14
},
{
"level_0":2,
"index":3,
"name":"C",
"value":0.4
},
{
"level_0":3,
"index":4,
"name":"D",
"value":1.13
},
{
"level_0":4,
"index":5,
"name":"E",
"value":8.25
}
]
}
Formato nativo de Python
[11]:
#
# Escribe el dataset en formato binario
#
df.to_pickle('/tmp/data.pickle')
#
# Lee el archivo en formato binario
#
pd.read_pickle('/tmp/data.pickle')
[11]:
index name value
0 1 A 3.03
1 2 B 5.14
2 3 C 0.40
3 4 D 1.13
4 5 E 8.25
Archivos delimitados por caracteres con Pandas
[12]:
#
# Formato por defecto generado por pandas
#
df.to_csv(
"/tmp/data.csv",
index=False,
)
!cat /tmp/data.csv
index,name,value
1,A,3.03
2,B,5.14
3,C,0.4
4,D,1.13
5,E,8.25
[13]:
#
# Escritura en formato de Español que es usado
# por defecto en Microsoft Excel
#
df.to_csv(
"/tmp/data.csv2",
sep=";",
decimal=",",
index=False,
)
!cat /tmp/data.csv2
index;name;value
1;A;3,03
2;B;5,14
3;C;0,4
4;D;1,13
5;E;8,25
[14]:
#
# Lectura del archivo
#
pd.read_csv(
"/tmp/data.csv2",
sep=";",
thousands=None,
decimal=",",
)
[14]:
index name value
0 1 A 3.03
1 2 B 5.14
2 3 C 0.40
3 4 D 1.13
4 5 E 8.25
Formato de ancho fijo con Pandas
[15]:
%%writefile /tmp/data.txt
indexnames valuescodes
1john wick 2.13 10
2mark twin 3.14 11
3louis ng 4.34 12
4dan brown 2.31 13
5ann marie 4.98 14
Writing /tmp/data.txt
[16]:
#
# Se debe especificar el ancho de cada columna
#
pd.read_fwf(
"/tmp/data.txt",
colspecs="infer",
widths=[5, 9, 8, 5],
)
[16]:
index names values codes
0 1 john wick 2.13 10
1 2 mark twin 3.14 11
2 3 louis ng 4.34 12
3 4 dan brown 2.31 13
4 5 ann marie 4.98 14
HTML con Pandas
[17]:
#
# Escritura en HTML. Este formato es util para
# insertar el dataframe en una pagina web
#
df.to_html(
"/tmp/data.html",
index=False,
)
!cat /tmp/data.html
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th>index</th>
<th>name</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>A</td>
<td>3.03</td>
</tr>
<tr>
<td>2</td>
<td>B</td>
<td>5.14</td>
</tr>
<tr>
<td>3</td>
<td>C</td>
<td>0.40</td>
</tr>
<tr>
<td>4</td>
<td>D</td>
<td>1.13</td>
</tr>
<tr>
<td>5</td>
<td>E</td>
<td>8.25</td>
</tr>
</tbody>
</table>
Microsoft Excel
[18]:
#
# Requiere esta librería para realizar la
# lectura y escritura de archivos de Excel
#
!pip3 install --quiet openpyxl
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[19]:
#
# Exportación del df a formato de Excel
#
df.to_excel(
"/tmp/data.xlsx",
index=False,
)
#
# Lectura del archivo de Excel
#
pd.read_excel(
'/tmp/data.xlsx',
engine='openpyxl',
)
[19]:
index name value
0 1 A 3.03
1 2 B 5.14
2 3 C 0.40
3 4 D 1.13
4 5 E 8.25
Formato HDF5
[20]:
#
# Se requiere esta librería
#
!pip3 install --quiet tables
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[21]:
#
# Exportación a formato HDF5
#
df.to_hdf(
"/tmp/data.h5",
key="G1",
)
pd.read_hdf(
"/tmp/data.h5",
key="G1",
)
[21]:
index name value
0 1 A 3.03
1 2 B 5.14
2 3 C 0.40
3 4 D 1.13
4 5 E 8.25
[22]:
pd.read_hdf('/tmp/data.h5')
[22]:
index name value
0 1 A 3.03
1 2 B 5.14
2 3 C 0.40
3 4 D 1.13
4 5 E 8.25
STATA
[23]:
#
# Exporta el archivo
#
df.to_stata('/tmp/data.dta')
#
# Lee el archivo
#
pd.read_stata('/tmp/data.dta')
[23]:
level_0 index name value
0 0 1 A 3.03
1 1 2 B 5.14
2 2 3 C 0.40
3 3 4 D 1.13
4 4 5 E 8.25
Lectura de Matlab y Octave
[24]:
import scipy.io as sio
sio.savemat("/tmp/data", {"df": df})
sio.loadmat("/tmp/data")
[24]:
{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Aug 29 04:14:07 2021',
'__version__': '1.0',
'__globals__': [],
'df': array([[(array([[None]], dtype=object), array([[None]], dtype=object), array([[None]], dtype=object))]],
dtype=[('index', 'O'), ('name', 'O'), ('value', 'O')])}