read_csv дает ошибку для набора данных movielens 20M - PullRequest
0 голосов
/ 11 ноября 2018

Я впервые использую pandas и хотел провести анализ данных для набора данных Movielens. После запуска кода для набора данных 1M я захотел поэкспериментировать с Movielens 20M

Я читаю только один файл, т.е. ratings.csv

Однако я столкнулся с множеством проблем с набором данных 20M, и, потратив много времени, я понял, что это происходит потому, что типы читаемых столбцов не соответствуют ожидаемым. Следующий код (где путь - это путь файла ratings.csv)

import pandas as pd
import numpy as np

df = pd.read_csv('../data/ml-20m/ratings.csv',sep=',',names= 
['userId','movieId','rating','timestamp'],engine='python', dtype= 
{'userId':np.int32, 'movieId':np.int32, 'rating':np.float64, 
'timestamp':np.int64}, skipinitialspace=True, error_bad_lines=False)

выдаёт мне следующую ошибку: -

Traceback (последний вызов был последним): File "/Home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 1663, в _cast_types values ​​= astype_nansafe (values, cast_type, copy = True) Файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/core/dtypes/cast.py", строка 709, в astype_nansafe вернуть lib.astype_intsafe (arr.ravel (), dtype) .reshape (arr.shape) Файл "pandas / _libs / lib.pyx", строка 456, в pandas._libs.lib.astype_intsafe Файл "pandas / _libs / src / util.pxd", строка 142 в util.set_value_at_unsafe ValueError: неверный литерал для int () с основанием 10: 'movieId'

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "test.py", строка 4, в df = pd.read_csv ('../ data / ml-20m / ratings.csv', sep = ',', names = ['userId', 'movieId', 'rating', 'timestamp'], engine = ' python ', dtype = {'userId': np.int32, 'movieId': np.int32, 'rating': np.float64, 'timestamp': np.int64}, skipinitialspace = True, error_bad_lines = False)
файл "/Home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 678, в parser_f вернуть _read (filepath_or_buffer, kwds) файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 446, в _read data = parser.read (nrows) Файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 1036, в чтении ret = self._engine.read (nrows) Файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 2272, в чтении data = self._convert_data (data) Файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 2338, в _convert_data clean_conv, clean_dtypes) Файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 1574, в _convert_to_ndarrays cvals = self._cast_types (cvals, cast_type, c) Файл "/home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py", строка 1666, в _cast_types "type% s"% (column, cast_type)) ValueError: Невозможно преобразовать столбец movieId в тип

В основном я хочу пропустить все строки, тип данных которых не соответствует словарю {'userId': np.int32, 'movieId': np.int32, 'rating': np.float64, 'Метка времени': np.int64}

Если я не передам аргумент dtype для read_csv, то все четыре столбца окажутся типа «объект», что не то, что я хочу.

Я искал в Google и не нашел никого, кто сталкивался с этой проблемой. Вы можете мне помочь?

Я использую python3

1 Ответ

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

Проблема в том, что вы определяете имена столбцов, но csv имеет заголовок, поэтому первая строка DataFrame такая же, как имена столбцов, поэтому все строки преобразуются в строки:

df = pd.read_csv('ratings.csv', 
                 names= ['userId','movieId','rating','timestamp'])
print (df.head())
    userId   movieId  rating  timestamp
0  user_id  movie_id  rating  timestamp
1        1      1193       5  978300760
2        1       661       3  978302109
3        1       914       3  978301968
4        1      3408       4  978300275

Решение - использовать параметр skiprows=1 или header=0 для переименования имен столбцов по параметру names:

df = pd.read_csv('ratings.csv', 
                 dtype= {'userId':np.int32, 
                         'movieId':np.int32, 
                         'rating':np.float64, 
                         'timestamp':np.int64},
                 header=0, #skiprows=1
                 names= ['userId','movieId','rating','timestamp'])
print (df.head())

   userId  movieId  rating  timestamp
0       1     1193     5.0  978300760
1       1      661     3.0  978302109
2       1      914     3.0  978301968
3       1     3408     4.0  978300275
4       1     2355     5.0  978824291

Если вы не хотите переименовывать имена столбцов:

df = pd.read_csv('ratings.csv', 
                 dtype= {'userId':np.int32, 
                         'movieId':np.int32, 
                         'rating':np.float64, 
                         'timestamp':np.int64})

print (df.head())

   user_id  movie_id  rating  timestamp
0        1      1193     5.0  978300760
1        1       661     3.0  978302109
2        1       914     3.0  978301968
3        1      3408     4.0  978300275
4        1      2355     5.0  978824291
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...