我第一次使用熊猫,想对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
答案 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