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')])}