【问题标题】:Matching values from one csv file to another and replace entire column using pandas/python将一个 csv 文件中的值匹配到另一个文件并使用 pandas/python 替换整个列
【发布时间】:2017-10-25 16:45:06
【问题描述】:

考虑以下示例:

我有一个 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”中显示电影名称,而不是“movie id”,我需要将 u.item.csv 的每个 ID 与 movie_id 与 training_data.csv 进行匹配 然后替换它。

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

附:我知道训练数据将按用户顺序排列,并且如果替换会产生准确的输出,但我需要了解这一点,这样当我推荐电影时,我需要显示电影名称而不是 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) - 手动输入已完成

【问题讨论】:

    标签: python python-2.7 csv pandas replace


    【解决方案1】:

    我认为你需要map by Series created by 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
    

    【讨论】:

    • 在我尝试这个的同时,你能否传递一些有用的链接来学习地图和 set_index,而不是手册。我可以实际尝试的东西。
    • 当然,pandas 文档非常好,也有一些很好的解释。用于地图检查this 和设置索引this
    • 代码更好。我已经学会了通过它来替换、追加和重命名列。非常棒的@jezrael
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多