tutorial - python pandas read excel column
error python read_fwf: ''dtype no es compatible con el analizador python-fwf'' (2)
Usando Python 2.7.5 y pandas 0.12.0, estoy tratando de importar archivos de texto de fuente de ancho fijo en un DataFrame con ''pd.io.parsers.read_fwf ()''. Los valores que estoy importando son todos numéricos, pero es importante que se guarden los ceros iniciales, por lo que me gustaría especificar el tipo de dtype en lugar de int.
De acuerdo con la documentación para esta función , el atributo dtype es compatible con read_fwf, pero cuando intento usarlo:
data= pd.io.parsers.read_fwf(file, colspecs = ([79,81], [87,90]), header = None, dtype = {0: np.str, 1: np.str})
Me sale el error:
ValueError: dtype is not supported with python-fwf parser
He intentado tantas variaciones como puedo pensar para establecer ''dtype = something'', pero todas devuelven el mismo mensaje.
¡Cualquier ayuda sería muy apreciada!
En lugar de especificar los dtypes, especifique un convertidor para la columna que desea mantener como str, basándose en el ejemplo de @ TomAugspurger:
from io import StringIO
import pandas as pd
data = StringIO(u"""
121301234
121300123
121300012
""")
pd.read_fwf(data, colspecs=[(0,3),(4,8)], converters = {1: str})
Lleva a
/n Unnamed: 1
0 121 0123
1 121 0012
2 121 0001
Los convertidores son un mapeo desde un nombre de columna o índice a una función para convertir el valor en la celda (por ej., Int los convertiría a enteros, flotaría en flotadores, etc.)
La documentación es probablemente incorrecta allí. Creo que el mismo docstring base se usa para varios lectores. En cuanto a una solución, ya que conoce los anchos antes de tiempo, creo que puede anteponer los ceros después del hecho.
Con este archivo y anchos [4, 5]
121301234
121300123
121300012
obtenemos:
In [38]: df = pd.read_fwf(''tst.fwf'', widths=[4,5], header=None)
In [39]: df
Out[39]:
0 1
0 1213 1234
1 1213 123
2 1213 12
Para completar los ceros faltantes, ¿funcionaría esto?
In [45]: df[1] = df[1].astype(''str'')
In [53]: df[1] = df[1].apply(lambda x: ''''.join([''0''] * (5 - len(x))) + x)
In [54]: df
Out[54]:
0 1
0 1213 01234
1 1213 00123
2 1213 00012
El 5 en la lambda anterior viene del ancho correcto. Tendría que seleccionar todas las columnas que necesitan ceros a la izquierda y aplicar la función (con el ancho correcto) a cada una.