我有两个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
没有特定的电影订单,只需要一个电影演员参与的数据库。
答案 0 :(得分:1)
我会这样做。
从第一个数据框中删除不相关的列:
actor_names.drop(['birthYear', 'deathYear'], axis=1, inplace=True)
从第二个数据框中获取actor的列名:
cast_columns = [column
for column in movie_cast.columns
if column.startswith('principalCast')]
为我们刚刚获得的每个列名运行合并,只留下我们需要的列:
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',.....])