3
respostas

[Dúvida] Pandas retorna um ValueError ao importar um arquivo xlsx

Estou tentando criar um DataFrame de um arquivo xlsx estou recebendo um erro ValueError Acontece que uma das colunas tem o caractere "-" no meio dos dados.

Já tentei criar o DataFrame com:

dados = pd.read_excel('vendedores.xlsx', converters = {'Comissão': srt})
dados = pd.read_excel('vendedores.xlsx', dtype = {'Comissão': str})
dados = pd.read_excel('vendedores.xlsx', na_values=['-'])

Mas sempre recebo o mesmo erro: ValueError: invalid literal for int() with base 10: '-'

É possível resolver por dentro do python sem ter que recorrer ao S.O. fazendo algum sed no arquivo?

Código:

import pandas as pd

dados = pd.read_excel('vendedores.xlsx')

Output:

Traceback (most recent call last):
  File "/home/sondahl/vendas/app.py", line 17, in <module>
    dados = pd.read_excel('vendedores.xlsx')
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/pandas/io/excel/_base.py", line 517, in read_excel
    data = io.parse(
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/pandas/io/excel/_base.py", line 1629, in parse
    return self._reader.parse(
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/pandas/io/excel/_base.py", line 793, in parse
    data = self.get_sheet_data(sheet, file_rows_needed)
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/pandas/io/excel/_openpyxl.py", line 616, in get_sheet_data
    for row_number, row in enumerate(sheet.rows):
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/openpyxl/worksheet/_read_only.py", line 81, in _cells_by_row
    for idx, row in parser.parse():
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 167, in parse
    row = self.parse_row(element)
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 303, in parse_row
    cells = [self.parse_cell(el) for el in row]
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 303, in <listcomp>
    cells = [self.parse_cell(el) for el in row]
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 214, in parse_cell
    value = _cast_number(value)
  File "/home/sondahl/vendas/venv/lib/python3.10/site-packages/openpyxl/worksheet/_reader.py", line 84, in _cast_number
    return int(value)
ValueError: invalid literal for int() with base 10: '-'
3 respostas

Oi Leandro, creio que vc está correto em fazer a conversão de dtype ao abrir o arquivo. Como o excel tenta inferir o tipo de dado da coluna de acordo com os dados em cada célula, mesmo que no arquivo esteja como 'Geral', provavelmente está passando como 'Número'.

o dtype só precisa ser str e não srt

#dados = pd.read_excel('vendedores.xlsx', dtype = {'Comissão': srt})

dados = pd.read_excel('vendedores.xlsx', dtype = {'Comissão': str})

Gil, obrigado pelo retorno, no código está str. Já corrigi no tópico.

dados = pd.read_excel('vendedores.xlsx', converters = {'Comissão': str})
dados = pd.read_excel('vendedores.xlsx', dtype = {'Comissão': srt})

Já tentei inclusive usar o usecols pra tirar essa coluna pra ver se pelo menos eu conseguiria criar o DataFrame, mas mesmo usando o usecols o erro ValueError: invalid literal for int() with base 10: '-' é retornado

Consegui uma solução meio tosca mas funcionou. Primeiro peguei o arquivo original e abri em um excel troquei as entradas com o caractere "-" por 0, salvei e consegui importar o DataFrame. Depois peguei o arquivo original e abri em um excel e apenas salvei sem alterar nenhum dado, e também eu consegui criar o DataFrame. Me fez pensar que tem algum problema na fonte do arquivo. Como eu queria um que o próprio python resolvesse o problema, tentei varias maneiras de converter o arquivo usando python, todas sem sucesso. Acabei me rendendo e usei o libreoffice para converter. O código ficou assim:

import os
import pandas as pd

os.system('libreoffice --convert-to xls vendedores.xlsx') 

dados = pd.read_excel('vendedores.xls', engine='xlrd')

print(dados)

Tosco mas funcionou.