read_csv给出了Movielens 20M数据集的错误

时间:2018-11-11 13:31:08

标签: python-3.x pandas

我第一次使用熊猫,想对Movielens数据集进行一些数据分析。在为1M数据集运行代码之后,我想尝试Movielens 20M

我只读取一个文件,即 ratings.csv

但是,我在使用20M数据集时遇到了多个问题,花了很多时间后才意识到这是因为读取的列的dtypes与预期不符。 以下代码(其中path是rating.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)

给我以下错误:-

  

回溯(最近通话最近):文件   “ /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”,   util.set_value_at_unsafe ValueError中的第142行:的无效文字   以10为底的int():“ movieId”

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近一次通话最后一次):文件“ 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”,   parser_f中的第678行       返回_read(filepath_or_buffer,kwds)文件“ /home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py”,   _read中的第446行       数据= 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行,处于读取状态       数据= self._convert_data(data)文件“ /home/sahildeep/.local/lib/python3.5/site-packages/pandas/io/parsers.py”,   _convert_data中的第2338行       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中       “类型%s”%(列,cast_type))ValueError:无法将movieId列转换为类型

基本上我想跳过所有那些数据类型不符合字典的行     {'userId':np.int32,'movieId':np.int32,'rating':np.float64,     'timestamp':np.int64}

如果我不将dtype参数提供给read_csv,那么所有四列的结果都是“对象”类型,这不是我想要的。

我在Google上进行搜索,发现没有人遇到此问题。你能帮我吗?

我正在使用python3

1 个答案:

答案 0 :(得分:2)

问题是您定义了列名,但是csv具有标题,因此function App() { function buttonClicked() { useEffect(() => { // Fetch from API }); } return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h1 className="App-title">App Title</h1> </header> <p className="App-intro"> To get started, edit <code>src/App.js</code> and save to reload. </p> <button onClick={buttonClicked}>Make API Call</button> </div> ); } 的第一行与列名相同,因此所有行都转换为字符串:

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