pandas read_csv не анализирует десятичный разделитель запятых при использовании dtype? - PullRequest
0 голосов
/ 11 октября 2018

Я хочу открыть CSV-файл, используя запятую в качестве десятичного разделителя.Я передаю decimal=",".Тем не менее, я всегда получаю сообщение об ошибке, что значение с плавающей запятой последней строки файла CSV не анализируется успешно (я пытался удалить некоторые строки файла CSV, и ошибка всегда происходит в последней строке ...).Значение с плавающей запятой также указано в CSV, поэтому я передаю quoting=csv.QUOTE_ALL.

Кто-нибудь знает, что здесь происходит?Если я уберу опцию dtype, она будет работать, но столбец amount будет строкой ...

Вот код, который я использую (переформатированный для удобства чтения):

import pandas as pd
import numpy as np
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y')
expenses = pd.read_csv("/home/jovyan/work/expenses.csv",
 quoting=csv.QUOTE_ALL, decimal=",", header=None, na_values=[""],
 names=['date','category','amount','currency','note','tags'],
 parse_dates=["date"], date_parser=dateparse,  
 dtype={"date": str,"category": str, "amount":float, "currency": str,
 "note": str, "tags": str})

1 Ответ

0 голосов
/ 11 октября 2018

Я думал, что это была проблема поведения панд, которого я не понимал, но похоже, что проблема была в прочитанных данных.Колонка с плавающей точкой также использовала разделитель тысяч, например «1,345,50».Эти строки вызвали проблемы.Решение состояло в том, чтобы использовать опцию read_csv thousands='.'.

Однако сообщение об ошибке сбивает с толку, так как значение, сообщаемое как неконвертируемое в float, берется из последней строки в файле csv, а не из строки, вызывающейпроблема ....

Как ссылка, вот сообщение об ошибке:

    ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

TypeError: Cannot cast array from dtype('O') to dtype('float64') according to the rule 'safe'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-109-e77d6530ab30> in <module>()
      3 import csv
      4 dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y')
----> 5 expenses = pd.read_csv("/home/jovyan/work/test.csv", quoting=csv.QUOTE_ALL, decimal=",", header=None, na_values=[""],names=['date','category','amount','currency','note','tags'],parse_dates=["date"], date_parser=dateparse,  dtype={"date": str,"category": str, "amount":float, "currency": str, "note": str, "tags": str})
      6 expenses['tags']=expenses['tags'].str.split(",")
      7 #,  dtype={"date": str,"category": str, "amount":float, "currency": str, "note": str, "tags": str}

/opt/conda/lib/python3.6/site-packages/pandas/io/parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, doublequote, delim_whitespace, low_memory, memory_map, float_precision)
    676                     skip_blank_lines=skip_blank_lines)
    677 
--> 678         return _read(filepath_or_buffer, kwds)
    679 
    680     parser_f.__name__ = name

/opt/conda/lib/python3.6/site-packages/pandas/io/parsers.py in _read(filepath_or_buffer, kwds)
    444 
    445     try:
--> 446         data = parser.read(nrows)
    447     finally:
    448         parser.close()

/opt/conda/lib/python3.6/site-packages/pandas/io/parsers.py in read(self, nrows)
   1034                 raise ValueError('skipfooter not supported for iteration')
   1035 
-> 1036         ret = self._engine.read(nrows)
   1037 
   1038         # May alter columns / col_dict

/opt/conda/lib/python3.6/site-packages/pandas/io/parsers.py in read(self, nrows)
   1846     def read(self, nrows=None):
   1847         try:
-> 1848             data = self._reader.read(nrows)
   1849         except StopIteration:
   1850             if self._first_chunk:

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

ValueError: could not convert string to float: '0,99'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...