Pandas Read_csv de cadena
 
El objetivo principal de este artículo es demostrar cómo leer datos de texto CSV de una cadena o paquete de datos usando Pandas en Python.
Python Pandas read_csv de la cadena
    
el problema
Los datos se pueden almacenar en múltiples formas; dos de las formas principales se definen como estructuradas y no estructuradas. Estos formularios principales se pueden dividir en muchos formularios, CSV (valores separados por comas) es uno de ellos.
Mientras leemos datos de un archivo CSV, ya sea para algunas consultas o procesamientos complejos, según la situación, es posible que necesitemos leer datos de una cadena o un paquete determinado.
Considere el siguiente código:
import pandas as pd
import pkgutil
from io import StringIO
def get_data_file(pkg, path):
    f = StringIO()
    contents = unicode(pkgutil.get_data("pymc.examples", "data/wells.dat"))
    f.write(contents)
    return f
wells = get_data_file("pymc.examples", "data/wells.dat")
data = pd.read_csv(wells, delimiter=" ", index_col="id", dtype={"switch": np.int8})
Producción :
 File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 401, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 209, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 509, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 611, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 893, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "parser.pyx", line 441, in pandas._parser.TextReader.__cinit__ (pandas/src/parser.c:3940)
  File "parser.pyx", line 551, in pandas._parser.TextReader._get_header (pandas/src/parser.c:5096)
pandas._parser.CParserError: Passed header=0 but only 0 lines in file
En el siguiente código, se crea una función llamada get_data_file para obtener datos del paquete. Para realizar esta operación, se necesitan dos métodos denominados paquete y ruta, que almacenan el nombre del paquete y la ruta del archivo, respectivamente.
El valor devuelto de get_data_file luego se pasa al método read_csv para leer los datos, pero como se ve en la salida, se devuelve un error de tipo CParserError con la descripción Passed header=0 but only 0 lines in file.
la solución
La solución a este problema se puede abordar de dos maneras diferentes según el requisito.
Enfoque 1 - Para cadena con io.StringIO
Considere el siguiente código:
import pandas as pd
from io import StringIO
df = pd.read_csv(
    StringIO(
        "id,switch, arsenic, dist, assoc, educ\n"
        "1, 2.36, 16.826000, 0, 0, 0\n"
        "2, 1, 0.71, 47.321999, 0, 0\n"
        "3, 0, 2.07, 20.966999, 0, 10\n"
        "4, 1, 1.15, 21.486000, 0, 12\n"
        "5, 1, 1.10, 40.874001, 1, 14\n"
        "6, 2, 1.22, 23.123131, 1, 23\n"
        "7, 5, 5.33, 29.232322, 0, 38\n"
        "8, 1, 2.38, 90.222221, 1, 10\n"
        "9, 9, 2.01, 10.222334, 0, 0\n"
        "10, 0, 9.12, 20.324252, 0, 10\n"
    ),
    index_col=0,
)
print(df)
Producción :
    switch   arsenic       dist   assoc   educ
id
1     2.36    16.826   0.000000       0      0
2     1.00     0.710  47.321999       0      0
3     0.00     2.070  20.966999       0     10
4     1.00     1.150  21.486000       0     12
5     1.00     1.100  40.874001       1     14
6     2.00     1.220  23.123131       1     23
7     5.00     5.330  29.232322       0     38
8     1.00     2.380  90.222221       1     10
9     9.00     2.010  10.222334       0      0
10    0.00     9.120  20.324252       0     10
Usando el módulo StringIO, es posible pasar una cadena al método read_csv para leer datos de texto CSV de una cadena.
El módulo StringIO ayuda a ejecutar métodos que normalmente requieren objetos “similares a archivos”; al pasar una cadena a su constructor, crea un objeto “similar a un archivo” que luego se puede pasar a métodos que requieren un objeto “similar a un archivo”.
Es importante tener en cuenta que en Python 2.7, el módulo StringIO se definió como StringIO, mientras que en Python 3+ se cambió a io.StringIO.
Se debe implementar una implementación adecuada para manejar los casos en los que se supone que el código es flexible y está destinado a ejecutarse tanto en Python2 como en Python3.
Enfoque 2: para paquetes con io.BytesIO
Considere el siguiente código:
import numpy as np
import pandas as pd
import io
import pkgutil
wells = pkgutil.get_data("pymc.examples", "data/wells.dat")
print("Data Type: ", str(type(wells)))
df = pd.read_csv(
    io.BytesIO(wells),
    encoding="utf8",
    sep=" ",
    index_col="id",
    dtype={"switch": np.int8},
)
print(df.head())
Producción :
Data Type: <class 'bytes'>
    switch  arsenic       dist  assoc  educ
id
1        1     2.36  16.826000      0     0
2        1     0.71  47.321999      0     0
3        0     2.07  20.966999      0    10
4        1     1.15  21.486000      0    12
5        1     1.10  40.874001      1    14
En el caso de leer datos CSV de un paquete, primero podemos usar el método pkgutil.get_data para obtener los datos, luego, para leer los datos CSV de los datos obtenidos, podemos usar el método read_csv.
Es importante tener en cuenta que debemos usar el método io.BytesIO para pasar los datos obtenidos del método pkgutil.get_data. Y por mencionar la codificación de los datos, que en nuestro caso es utf8.
Los separadores se definen usando el argumento sep, y la columna de índice debe indicarse usando el argumento index_col.
Con todo, el método read_csv toma los siguientes argumentos en el código mencionado anteriormente.
- io.BytesIO(wells)corresponde a los datos extraídos del paquete deseado y debe pasarse en forma de bytes utilizando el método- io.BytesIOpara convertirlo en bytes y pasarlo como un objeto “similar a un archivo”. debido al requisito de objeto “similar a un archivo” de- read_csv.
- encoding='utf8'se refiere a la codificación de texto de la entrada, que puede tener diferentes valores según el tipo de datos pasados.
- sep=' 'indica en qué tipo de separadores consisten los datos. Puede ser diferente en función de cómo se crearon los supuestos datos CSV en primer lugar.
- index_col="id"se refiere al nombre de la columna de índice de datos; de nuevo, depende de los datos y puede variar de un archivo a otro.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn