with tutorial read_excel read open excelfile column python parsing pandas

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.