@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(хотя и с правильными числами).
  • Вопрос задан
  • 108 просмотров
Решения вопроса 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')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы