将一个csv文件中的值与另一个文件匹配,并使用pandas / python

时间:2017-05-25 06:22:02

标签: python python-2.7 csv pandas replace

考虑以下示例:

我有一个Movielens数据集 -

u.item.csv

ID|MOVIE NAME (YEAR)|REL.DATE|NULL|IMDB LINK|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|
1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0
2|GoldenEye (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?GoldenEye%20(1995)|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0
3|Four Rooms (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Four%20Rooms%20(1995)|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0

这里使用的分离器是Pipe,它仍然可以管理。

training_data.csv

,user_id,movie_id,rating,unix_timestamp
0,1,1,5,874965758
1,1,2,3,876893171
2,1,3,4,878542960

因为我需要在" Training_data"中显示电影名称,而不是"电影ID"我需要将 u.item.csv 的每个ID与带有 training_data.csv 的movie_id匹配,然后将其替换。

我正在使用Python Pandas,并且训练数据已从Sframe转换为Dataframe转换为CSV。这样我就可以获得所需的更改,但这种更改尚未成功。我当然可以使用一些循环结构,但匹配和替换是我面临的真正挑战。

P.S。我知道训练数据将按用户顺序排列,并且如果被替换将产生确切的输出,但我需要学习这一点,以便当我推荐电影时,我需要MOVIE名称来显示而不是ID。

我已经尝试了

  1. THIS (pandas-python-replace-multiple-values-in-multiple-columns) - 但如果我在数据集中拥有100K值,可能会耗费大量时间
  2. THIS (pandas-replace-multiple-values-one-column) - 未解释的匹配值
  3. THIS (pandas-replacing-column-values) - 完成手动输入

1 个答案:

答案 0 :(得分:0)

我认为您需要在map创建的Series之前set_index

print (df1.set_index('ID')['MOVIE NAME (YEAR)'])
ID
1     Toy Story (1995)
2     GoldenEye (1995)
3    Four Rooms (1995)
Name: MOVIE NAME (YEAR), dtype: object

df2['movie_id'] = df2['movie_id'].map(df1.set_index('ID')['MOVIE NAME (YEAR)'])
print (df2)
   user_id           movie_id  rating  unix_timestamp
0        1   Toy Story (1995)       5       874965758
1        1   GoldenEye (1995)       3       876893171
2        1  Four Rooms (1995)       4       878542960

或使用replace

df2['movie_id'] = df2['movie_id'].replace(df1.set_index('ID')['MOVIE NAME (YEAR)'])
print (df2)
   user_id           movie_id  rating  unix_timestamp
0        1   Toy Story (1995)       5       874965758
1        1   GoldenEye (1995)       3       876893171
2        1  Four Rooms (1995)       4       878542960

差异如果不匹配,map创建NaN并替换let原始值:

print (df2)
   user_id  movie_id  rating  unix_timestamp
0        1         1       5       874965758
1        1         2       3       876893171
2        1         5       4       878542960 <- 5 not match

df2['movie_id'] = df2['movie_id'].map(df1.set_index('ID')['MOVIE NAME (YEAR)'])
print (df2)
   user_id          movie_id  rating  unix_timestamp
0        1  Toy Story (1995)       5       874965758
1        1  GoldenEye (1995)       3       876893171
2        1               NaN       4       878542960
df2['movie_id'] = df2['movie_id'].replace(df1.set_index('ID')['MOVIE NAME (YEAR)'])
print (df2)
   user_id          movie_id  rating  unix_timestamp
0        1  Toy Story (1995)       5       874965758
1        1  GoldenEye (1995)       3       876893171
2        1                 5       4       878542960