【问题标题】:Creating a pandas dataframe by searching two dataframes通过搜索两个数据框创建熊猫数据框
【发布时间】:2018-01-10 03:05:58
【问题描述】:

我有两个熊猫数据框:

第一个表Artist-Name DataFrameIMDb 上的每个演员都有一个唯一标识符,并带有相应的演员名称。

第二个表Movie-Cast DataFrame 为 IMDb 上的每部电影以及相应电影的前 7 名演员/女演员提供唯一标识符(艺术家代码对应于第一个表中演员的唯一标识符)。

我想创建一个新的 Actor-Movie DataFrame,它将艺术家的名字作为第一列,随后的列是演员出现过的所有电影。所以我想使用来自的“nconst”表 1 为表 2 中的每部电影搜索每个“principalCast”列,如果演员出现在“principalCast”位置之一(1-7),则将演员出现的电影标题添加到新的 Actor-电影数据帧作为一列。最终,我想要一张有很多列的表格,其中包含艺术家参与的所有电影。

我尝试合并和旋转 DataFrame,但没有成功。我也尝试过使用带有两个 for 循环的 itertuples:

for row in actor_names.itertuples():
ldic = []
for r in movie_cast.itertuples():
    if row[1] in [r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10]]:
        ldic.append({row[1]:[].append(r[2])})

itertuples 需要几个小时并且不会产生任何结果(我的整个电影数据库超过 2000 行,演员数据库超过 800 万行)。但是,上面的代码是我操作的错误逻辑。

有没有一种有效的方法通过使用表 1 的唯一参与者标识符来搜索表 2 中的每个“principalCast”(1-7)来创建新的 DataFrame?我想要的输出是:

**primaryName     | nconst    |   movie 1    |   movie 2  | ... | movie n**

Brad Pitt         | nm0000015 | Fight Club   |   Seven    | ... | Mr&Mrs Smith

Jennifer Lawrence | nm0000109 | Mother       |Hunger Games| ... | Serena

电影没有特定的顺序,只需要一个包含演员参演电影的数据库。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我会这样做。

    1. 从您的第一个数据框中删除不相关的列:

      actor_names.drop(['birthYear', 'deathYear'], axis=1, inplace=True)
      
    2. 从第二个数据框中获取参与者的列名:

      cast_columns = [column
                      for column in movie_cast.columns
                      if column.startswith('principalCast')]
      
    3. 对我们刚刚获得的每个列名运行合并,只留下我们需要的列:

      for cast_column in cast_columns:
          actor_names = actor_names.merge(movie_cast, 
                                          how='left',
                                          left_on='nconst', 
                                          right_on=cast_column)
          valid_columns = [column
                           for column in actor_names.columns 
                           if (column in ('nconst', 'primaryName') 
                               or column.startswith('originalTitle'))]
          actor_names = actor_names[valid_columns]
      

    【讨论】:

      【解决方案2】:

      我没有测试它,但我的猜测是这样的:

       pd.merge(actor_names, movie_cast,how='left',left_on=['nconst'], right_on = ['principalCast1','principalCast2',.....])
      

      【讨论】:

      • 获取 ValueError:len(right_on) 必须等于 len(left_on)。假设你不能做多个 right_ons?
      • 通过迭代尝试: col_list = ['principalCast1','principalCast2',.....] for col in col_list: pd.merge(actor_names, movie_cast,how='left',left_on =['nconst'], right_on = [col_list])
      • 仍然出现维度错误:“缓冲区的维度数错误(预期为 1,得到 2)”
      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2016-01-13
      • 2020-09-21
      • 1970-01-01
      • 2013-11-03
      • 2015-05-28
      相关资源
      最近更新 更多