如何将三个文件与熊猫中的常见ID合并



我有三个文件是用户。

users.dat

1::F::1::10::48067
1::F::1::10::48067
1::F::1::10::48067
1::F::1::10::48067
1::F::1::10::48067
1::F::1::10::48067
1::F::1::10::48067
1::F::1::10::48067

等级.dat

1::1193::5::978300760
1::661::3::978302109
1::914::3::978301968
1::3408::4::978300275
1::2355::5::978824291
1::1197::3::978302268
1::1287::5::978302039
1::2804::5::978300719

movied.dat

1193::One Flew Over the Cuckoo's Nest (1975)::Drama
661::James and the Giant Peach (1996)::Animation|Children's|Musical
914::My Fair Lady (1964)::Musical|Romance
3408::Erin Brockovich (2000)::Drama
2355::Bug's Life, A (1998)::Animation|Children's|Comedy
1197::Princess Bride, The (1987)::Action|Adventure|Comedy|Romance
1287::Ben-Hur (1959)::Action|Adventure|Drama
2804::Christmas Story, A (1983)::Comedy|Drama

我的预期输出

1::1193::5::978300760::F::1::10::48067::One Flew Over the Cuckoo's Nest::Drama::1975
1::661::3::978302109::F::1::10::48067::James and the Giant Peach::Animation|Children's|Musical::1996
1::914::3::978301968::F::1::10::48067::My Fair Lady ::Musical|Romance::1964
1::3408::4::978300275::F::1::10::48067::Erin Brockovich ::Drama::2000
1::2355::5::978824291::F::1::10::48067::Bug's Life, A ::Animation|Children's|Comedy::1998

我试图在不使用熊猫的情况下合并这些文件。我创建了三个词典。用户ID是通用密钥。然后,我尝试使用用户键合并这三个文件。但是,我并没有使自己想要的东西合并。任何建议和建议将不胜感激

我的代码

import json
file = open("users.dat","r",encoding = 'utf-8')
users={}
  for line in file:
   x = line.split('::')
   user_id=x[0]
   gender=x[1]
   age=x[2]
   occupation=x[3]
   i_zip=x[4]
   users[user_id]=gender,age,occupation,i_zip.strip()
   file = open("movies.dat","r",encoding='latin-1')
 movies={}
    for line in file:
      x = line.split('::')
      movie_id=x[0]
      title=x[1]
      genre=x[2]
      movies[movie_id]=title,genre.strip()
      file = open("ratings.dat","r")
      ratings={}
      for line in file:
         x = line.split('::')
         a=x[0]
         b=x[1]
         c=x[2]
         d=x[3]
         ratings[a]=b,c,d.strip()
    newdict = {}
    newdict.update(users)
    newdict.update(movies)
    newdict.update(ratings)
    for i in users.keys():
       addition = users[i] + movies[i]+ratings[i]
       newdict[i] = addition
    with open('data.txt', 'w') as outfile:  
       json.dump(newdict, outfile)

我像这样的输出

{"1": ["F", "1", "10", "48067", "Toy Story (1995)", "Animation|Children's|Comedy", "1246", "4", "978302091"], "2": ["M", "56", "16", "70072", "Jumanji (1995)", "Adventure|Children's|Fantasy", "1247", "5", "978298652"],

您的代码中的第一个错误(除了混乱的凹痕之外(是,您将用户ID的评分从用户ID作为钥匙中算出:

ratings[a]=b,c,d.strip()

对于您的数据集,字典ratings最终将以Value { '1': ('2804', '5', '978300719') }出现。因此,除一个评级外,所有的评级都将丢失,因为您只有一个用户。

您想做的是将评分数据视为列表,而不是字典。您要实现的结果也是评分的扩展版本,因为您最终会像得分一样多。

其次,您不需要json模块,因为您所需的输出不采用JSON格式。

这是一个完成工作的代码:

#!/usr/bin/env python3
# Part 1: collect data from the files
users = {}
file = open("users.dat","r",encoding = 'utf-8')
for line in file:
    user_id, gender, age, occupation, i_zip  = line.rstrip().split('::')
    users[user_id] = (gender, age, occupation, i_zip)
movies={}
file = open("movies.dat","r",encoding='latin-1')
for line in file:
    movie_id, title, genre = line.rstrip().split('::')
    # Parse year from title
    title = title.rstrip()
    year = 'N/A'
    if title[-1]==')' and '(' in title:
        short_title, in_parenthesis = title.rsplit('(', 1)
        in_parenthesis = in_parenthesis.rstrip(')').rstrip()
        if in_parenthesis.isdigit() and len(in_parenthesis)==4:
            # Text in parenthesis has four digits - it must be year
            title = short_title.rstrip()
            year = in_parenthesis
    movies[movie_id] = (title, genre, year)
ratings=[]
file = open("ratings.dat","r")
for line in file:
    user_id, movie_id, score, dt = line.rstrip().split('::')
    ratings.append((user_id, movie_id, score, dt))
# Part 2: save the output
file = open('output.dat','w',encoding='utf-8')
for user_id, movie_id, score, dt in ratings:
    # Get user data from dictionary
    gender, age, occupation, i_zip = users[user_id]
    # Get movie data from dictionary
    title, genre, year = movies[movie_id]
    # Merge data into a single string
    row = '::'.join([user_id, movie_id, score, dt,
                    gender, age, occupation, i_zip,
                    title, genre, year])
    # Write to the file
    file.write(row + 'n')
file.close()

第1部分是基于您的代码,我将评分保存到列表(不是字典(的主要区别,并且我添加了几年的解析。

第2部分是保存输出的地方。

运行脚本后output.dat文件的内容:

1::1193::5::978300760::F::1::10::48067::One Flew Over the Cuckoo's Nest::Drama::1975
1::661::3::978302109::F::1::10::48067::James and the Giant Peach::Animation|Children's|Musical::1996
1::914::3::978301968::F::1::10::48067::My Fair Lady::Musical|Romance::1964
1::3408::4::978300275::F::1::10::48067::Erin Brockovich::Drama::2000
1::2355::5::978824291::F::1::10::48067::Bug's Life, A::Animation|Children's|Comedy::1998
1::1197::3::978302268::F::1::10::48067::Princess Bride, The::Action|Adventure|Comedy|Romance::1987
1::1287::5::978302039::F::1::10::48067::Ben-Hur::Action|Adventure|Drama::1959
1::2804::5::978300719::F::1::10::48067::Christmas Story, A::Comedy|Drama::1983

最新更新