Not Fibonacci(矩阵连乘)
1434
2022-08-17
python怎么用pandas读取csv文件(如何用pandas读取csv文件)
本文主要介绍了python怎么用pandas读取csv文件,有需要的朋友可以参考一下:
需求:使用pandas读取ratings.csv文件,把读取的内容按时间戳排序后写入文件中
csv文件:ratings.csv
userId,movieId,rating,timestamp
1,296,5.0,1147880044
1,306,3.5,1147868817
1,307,5.0,1147868828
1,665,5.0,1147878820
1,899,3.5,1147868510
1,1088,4.0,1147868495
1,1175,3.5,1147868826
1,1217,3.5,1147878326
1,1237,5.0,1147868839
1,1250,4.0,1147868414
test.py
import pandas as pd
# usecols=[0,1,2,3] 使用前4列,全读取的话usecols可省
# nrows 读取csv文件前10000行数据
data = pd.read_csv('../data/rating/ratings.csv',nrows = 10000,encoding='utf-8',usecols=[0,1,2,3])
# data里面按时间戳排序
data = data.sort_values(by=["timestamp"],ascending=[False])
print(data)
# 删除时间戳这一列 axis=1表示对列操作
data = data.drop('timestamp',axis=1)
# 将数据从DataFrame转成list列表
data = data.values.tolist()
print(data)
# 写入到文件中
with open("../data/rating/demo_data01",'w',encoding='utf-8') as f:
for list in data:
# 转成列表时 userId 和 movieId 是float类型,我需要转成int类型
list[0] = int(list[0])
list[1] = int(list[1])
s=str(list[0])+'\t'+str(list[1])+'\t'+str(list[2])+'\n'
f.write(s)
然而,我在构建完demo_data01后使用这个输入集到模型网络中有问题
报错:
InvalidArgumentError (see above for traceback): indices[5519] = 4979 is not in [0, 3287)
[[Node: embedding_lookup_1 = GatherV2[Taxis=DT_INT32, Tindices=DT_INT32, Tparams=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](Variable_1/read, _arg_Placeholder_1_0_1, embedding_lookup_1/axis)]]
我透,[0,3287)是我的模型从1w条数据中抽取了75个用户,包含3287条电影ID及3287条电影评分。
这个4979是从哪冒出来的???
原因:在模型中大量用到了range()函数,1w条数据随机抽取了几千条,这意味输入集的 userId 和 movieId 需要在一个连续的区间里面,上面这个报错是 movieId = 4979 不在连续区间 [0,3287)中。所以需要对 userId 和 movieId 做数据预处理让 movieId 处于[0,3287)这个区间中( userId 对我来说没必要处理)。
import pandas as pd
#添加数据
#usecols=[0,1,2]使用前三列,不要时间戳了
data = pd.read_csv('../data/rating/ratings.csv',nrows = 10000,encoding='utf-8',usecols=[0,1,2,3])
# 根据 timestamp 降序排序
data = data.sort_values(by=["timestamp"],ascending=[False])
# print(data)
#删除 timestamp 列
data = data.drop('timestamp',axis=1)
# 对 movieID 升序排序
data = data.sort_values(by=["movieId"],ascending=[True])
# 取出 movieId 列
x = data.drop(['userId','rating'],axis=1)
#print(data)
#print(x.drop_duplicates())
# movieId列去掉重复值,保证做字典时value值是唯一的
y = x.drop_duplicates().values.tolist()
# 创建字典
d={}
# 循环字典映射 index : movieId
# index:movieId {0: [1], 1: [2], 2: [3], 3: [5], 4: [6],`...}
for index in range(len(y)):
d[index] = y[index]
#print(d)
#data = data.values.tolist()
# 写入demo_data01
with open("../data/rating/demo_data01",'w',encoding='utf-8') as f:
for i in range(len(data)):
for k in d:
# 根据 movieId 这个 value 值找 key 值,用 key 值取代 movieId
if data[i][1] in d[k]:
s = str(int(data[i][0]))+'\t'+str(k)+'\t'+str(data[i][2])+'\n'
f.write(s)
经过上述操作后,数据集已经能成功在模型中运行了!
好吧,老师让我把userId也映射成连续的区间
test.py
import pandas as pd
import utils
#添加数据,取前10w行 统计得到用户ID数量:757,电影ID数量:9786
data = pd.read_csv('../data/rating/ratings.csv',nrows = 100000,encoding='utf-8',usecols=[0,1,2,3]) #usecols=[0,1,2]使用前三列,不要时间戳了
# 根据时间戳删除timestamp列降序排序
data = data.sort_values(by=["timestamp"],ascending=[False])
# print(data)
#删除timestamp列
data = data.drop('timestamp',axis=1)
# 对 movieID 升序排序
data = data.sort_values(by=["movieId"],ascending=[True])
# 取出movieId列
x = data.drop(['userId','rating'],axis=1)
# 取出userId列
x1 = data.drop(['movieId','rating'],axis=1)
#print(data)
#print(x.drop_duplicates())
# movieId列去重,保证做字典时value值是唯一的
y = x.drop_duplicates().values.tolist()
# userId列去重,保证做字典时value值是唯一的
y1 = x1.drop_duplicates().values.tolist()
# 电影字典
d={}
# 用户字典
d1={}
# 循环字典映射 index : movieId
# index:movieId {0: [1], 1: [2], 2: [3], 3: [5], 4: [6],`...},后期需要把这个字典返回出去以便找出真正的电影ID
for index in range(len(y)):
d[index] = y[index]
for index in range(len(y1)):
d1[index] = y1[index]
# 保存文件以便以后找到原始ID,你也可以用其他方法保存
# 获取时 u_dict = utils.pickle_load(“../data/rating/user_dict”)
utils.pickle_save(d,"../data/rating/movie_dict")
utils.pickle_save(d1,"../data/rating/user_dict")
print(d)
print(d1)
print('用户ID数量:%d,电影ID数量:%d'%(len(d1),len(d)))
data = data.values.tolist()
# 写入demo_data01,pycharm 新建一个file(text)
with open("../data/rating/demo_data01",'w',encoding='utf-8') as f:
for i in range(len(data)):
s=''
for u in d1:
if data[i][0] in d1[u]:
s = s+str(u)+'\t'
for k in d:
if data[i][1] in d[k]:
s = s + str(k)+'\t'+str(data[i][2])+'\n'
f.write(s)
utils.py
#coding: utf-8
import pickle
import time
class Log():
def log(self, text, log_time=False):
print('log: %s' % text)
if log_time:
print('time: %s' % time.asctime(time.localtime(time.time())))
def pickle_save(object, file_path):
f = open(file_path, 'wb')
pickle.dump(object, f)
def pickle_load(file_path):
f = open(file_path, 'rb')
return pickle.load(f)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~