通过搜索两个数据帧来创建pandas数据帧

时间:2018-01-09 11:19:07

标签: python pandas

我有两个pandas DataFrames:

第一个表Artist-Name DataFrame具有IMDb上每个参与者的唯一标识符,以及相应的参与者名称。

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

我想创建一个新的Actor-Movie DataFrame,它将艺术家的名字作为第一列,后续列将成为演员出现的所有电影。所以我想使用“nconst”来自表1为表2中的每部电影搜索每个“principalCast”列,如果演员出现在“principalCast”位置之一(1-7),则将演员出现的电影片名添加到新演员中 - 电影DataFrame作为列。最终,我希望有一个包含许多专栏的表格,其中包含艺术家所参与的所有电影。

我尝试合并和旋转DataFrames但没有成功。我也尝试过使用带有两个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行,而actor数据库是> 800万行)。但是,上面的代码是我正在运行的错误逻辑。

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

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

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

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

没有特定的电影订单,只需要一个电影演员参与的数据库。

2 个答案:

答案 0 :(得分:1)

我会这样做。

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

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

    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]
    

答案 1 :(得分:0)

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

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