Я выяснил проблему, с которой столкнулся с функцией def actors_loop(movie_df, actor_df)
.Проблема заключается в том, что
results['tconst'] == movie]['cast'] = (actor_df['primaryName'].loc[index])
устанавливает значение, равное копии кадра данных results
.Было бы лучше использовать метод df.set_value()
или метод df.at[]
.
Я также нашел гораздо более быстрое решение проблемы, вместо того, чтобы перебирать два кадра данных и создавать рекурсивные циклы, это было былучше повторить один раз.Итак, я создал список кортежей:
def actor_tuples(actor_df):
tuples =[]
for index, value in actor_df['knownForTitles'].iteritems():
cinemetography = [x.strip() for x in value.split(',')]
for movie in cinemetography:
tuples.append((actor_df['primaryName'].loc[index], movie))
return tuples
Это создало список кортежей следующего вида:
[('Fred Astaire', 'tt0043044'),
('Lauren Bacall', 'tt0117057')]
Затем я создал список номеров идентификаторов фильмов и индексных точек (из кадра данных фильма), который принял эту форму:
{'tt0000009': 0,
'tt0000147': 1,
'tt0000335': 2,
'tt0000502': 3,
'tt0000574': 4,
'tt0000615': 5,
'tt0000630': 6,
'tt0000675': 7,
'tt0000676': 8,
'tt0000679': 9}
Затем я использовал приведенную ниже функцию для итерации по кортежам актеров и использовал идентификатор фильма в качестве ключа в словаре фильма, это вернуло правильный фильмindex, который я использовал, чтобы добавить кортеж с именем актера в целевой фрейм данных:
def add_cast(movie_df, Atuples, Mtuples):
results_df = movie_df.copy()
results_df['cast'] = ''
counter = 0
total = len(Atuples)
for tup in Atuples:
#this passes the movie ID into the movie_dict that will return an index
try:
movie_index = Mtuples[tup[1]]
if results_df.at[movie_index, 'cast'] == '':
results_df.at[movie_index, 'cast'] += tup[0]
else:
results_df.at[movie_index, 'cast'] += ',' + tup[0]
except KeyError:
pass
#logging
counter +=1
if counter % 1000000 == 0:
logging.warning(f'Index {counter} out of {total}, {counter/total}% finished')
return results_df
Он работал за 10 минут (создавая 2 набора кортежей, затем добавляя функцию) для 16,5 миллионов кортежей актеров.Результаты ниже:
0 tt0000009 Miss Jerry 1894 Romance
1 tt0000147 The Corbett-Fitzsimmons Fight 1897 Documentary,News,Sport
2 tt0000335 Soldiers of the Cross 1900 Biography,Drama
3 tt0000502 Bohemios 1905 \N
4 tt0000574 The Story of the Kelly Gang 1906 Biography,Crime,Drama
cast
0 Blanche Bayliss,Alexander Black,William Courte...
1 Bob Fitzsimmons,Enoch J. Rector,John L. Sulliv...
2 Herbert Booth,Joseph Perry,Orrie Perry,Reg Per...
3 Antonio del Pozo,El Mochuelo,Guillermo Perrín,...
4 Bella Cola,Sam Crewes,W.A. Gibson,Millard John...
Спасибо, переполнение стека!