Задать вопрос
@M-Pack

Почему функция read_csv в pandas неправильно обрабатывает целочисленные и десятичные числа из CSV файла?

После написания такого кода:

import locale
import sys
from locale import atof
locale.setlocale(locale.LC_NUMERIC, '')
'en_GB.UTF-8'
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier 
from sklearn.model_selection import train_test_split 
from sklearn import metrics 
from sklearn.tree import export_graphviz
from six import StringIO  
from IPython.display import Image  
import pydotplus


col_names = ['Project', 'OrderDate', 'orderid', 'ClientID','IsRepeat','IsBlocked','IsManual','AutoDecision','ManualApprove','IsLoan','ShortTermAmount','ShortTermPeriod','LongTermAmount','LongTermPeriod','RequestedAmount','RequestedPeriod','LoanSum','Period','ShortTermScore','LongTermScore']
#dtypes={"Project": bool, "OrderDate": 'str', "orderid": "str", "ClientID" : "str","IsRepeat" :bool,"IsBlocked":bool,"IsManual":bool,"AutoDecision":bool,"ManualApprove":bool,"IsLoan":bool}# "ShortTermAmount":"Int64","ShortTermPeriod":"Int64","LongTermAmount":"Int64","LongTermPeriod":"Int64","RequestedAmount":"Int64","RequestedPeriod":"Int64","LoanSum":"Int64","Period":"Int64","ShortTermScore":"float64","LongTermScore":"float64"}
dtypes={"orderid": object, "ClientID" : object,"RequestedAmount":object,"RequestedPeriod":object}
parse_dates = ['OrderDate']
test = pd.read_csv("/home/man/Test_task.csv",sep=' , ', thousands=',', header=None, dtype=dtypes ,names=col_names, parse_dates=parse_dates, converters = {'Project': lambda x: bool(str(x)) if x != '-' else np.nan, 'IsRepeat': lambda x: bool(str(x)) if x != '-' else np.nan, 'IsBlocked': lambda x: bool(str(x)) if x != '-' else np.nan,'orderid': lambda x: int(x.replace(',','')) if x != '-' else np.nan, 'IsManual': lambda x: bool(str(x)) if x != '-' else np.nan, 'AutoDecision': lambda x: bool(str(x)) if x != '-' else np.nan, 'ManualApprove': lambda x: bool(str(x)) if x != '-' else np.nan, 'IsLoan': lambda x: bool(str(x)) if x != '-' else np.nan})#.fillna(0)
df = pd.DataFrame(data=test)
test.head()


Я получаю ошибку invalid literal for int() with base 10: 'orderid'.

Если я не пишу в conversion

'orderid': lambda x: int(x.replace(',','')) if x != '-' else np.nan,


, то заголовок таблицы печатается, но потом, при попытке подействовать на элементы таблицы как на числа, получаю ошибку, что нельзя действовать так на строки, при том, что pandas распознаёт dtype всех колонок как "object", а, судя по всему, вообще как "str".

Почему? Прилагаю сам csv файл.


https://drive.google.com/file/d/1Oseh4KnE98tC3-jRy...

по совету MaxU, я добавил обрамляющие пробелы в sep. Стало лучше, колонки LoanSum, Period, ShortTermScore, LongTermScore наконец-то стали распознаваться как float64, однако, теперь в этих колонках вместо чисел стоят NaN, и другие числовые колонки все также имеют тип object(хотя и с правильными числами).
  • Вопрос задан
  • 964 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 2
@o5a
header=None говорит о том, что строка заголовка у данных отсутствует (что не верно), поэтому он пытается разобрать первую строчку с названиями заголовков, как данные.

укажите header=0
Ответ написан
@M-Pack Автор вопроса
Мне помогло дописать в конце строки:

test = pd.read_csv("/home/man/Test_task.csv",sep=',', thousands=',', header = 0, decimal='.',names=col_names, usecols=col_names, parse_dates=parse_dates)
(сonverters я убрал от туда вообще)

строку:

.apply(pd.to_numeric, errors='coerce')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽