【问题标题】:Trouble Iterating Through Pandas Dataframe and Executing Spotify API无法通过 Pandas Dataframe 迭代和执行 Spotify API
【发布时间】:2021-11-26 03:52:55
【问题描述】:

从事一个项目,在数周内抓取广告牌前 100 名,使用 Spotify 的 API 查找歌曲音频功能,并将信息保存在新的 pandas df 中。

我让它一次最多可以进行 100 次搜索(spotify api 只允许 100 个 id),但是我无法编写代码来一次迭代 100 个歌曲 id,运行 api ,并保存到新的 df 中。

以下是一次 100 个 id 搜索的工作代码:

df_import = pd.read_csv(r'xxx/Billboard_Top_100.csv')

track_id_list = []
artist_name_list = []
track_name_list = []

for item, row in df_import.head(100).iterrows():
    
    artist  = row['Artist']

    track = row['Song']

    try:
        spotify_response = sp.search(q='artist:' + artist + ' track:' + track, type='track')
        
        #artist name
        artist_name = spotify_response['tracks']['items'][0]['artists'][0]['name']
        
        #song name
        track_name = spotify_response['tracks']['items'][0]['name']
        
        #unique sportify track id used for audio feautre search
        track_id = spotify_response['tracks']['items'][0]['uri']
        
        #splits string to search for features
        track_id_split = str.split(track_id, 'spotify:track:')
        
        track_id_list.append(track_id_split[1])
        
        artist_name_list.append(row['Artist'])
        
        track_name_list.append(row['Song'])
        
    except:
        
        DNF_song_search = sp.search(q=track)

        artist_name = DNF_song_search['tracks']['items'][0]['artists'][0]['name']
        
        if search(artist_name, artist):
            
            #song name
            track_name = DNF_song_search['tracks']['items'][0]['name']
            
            #unique sportify track id used for audio feautre search
            track_id = DNF_song_search['tracks']['items'][0]['uri']
            
            #splits string to search for features
            track_id_split = str.split(track_id, 'spotify:track:')
            
            track_id_list.append(track_id_split[1])
            
            artist_name_list.append(row['Artist'])
            
            track_name_list.append(row['Song'])
            
        else:
            print('Inconsistent artist match on: ' + artist + ' ' + artist_name + ' for song ' + track)
            
#spotify api to save song features based on track ids
features = sp.audio_features(track_id_list)            

#save features list into pandas df            
features_df = pd.DataFrame(data = features)      

#add artist and song columns from imported billboard df
features_df['Artist'] = artist_name_list
features_df['Song'] = track_name_list

#combine the two dataframes
df_merged = pd.merge(df_import, features_df, on = 'Song', how = 'left')
df_merged.to_csv('merged.csv')

我尝试将所有歌曲 ID 保存到一个列表中,然后一次执行 api 100 个 ID,但是当我尝试保存到新数据帧时出现各种错误。

【问题讨论】:

  • 您能否更具体地了解您遇到的各种错误?如果您包含完整的错误消息和堆栈跟踪,您将更有可能获得答案。 Billboard_Top_100.csv 的示例也会有所帮助
  • 对不起 - 昨天似乎是一个简单的问题有点沮丧,我的问题不是很清楚。在我澄清之前,我解决了我自己的问题。我遇到的主要问题是将从 spotify api 下载的列表对象加载到 pandas df x 次数,同时保持数据帧的完整性。我已经编辑了原始帖子以显示我的解决方案。感谢回复
  • @steezebutter 如果您找到了答案,请将其发布在答案部分并在 2 天内将其标记为正确,请勿编辑您的帖子。请阅读How to AskHow to Answer 并查看tour

标签: python pandas list dataframe spotify


【解决方案1】:

自己解决了

track_id_list = []
artist_name_list = []
track_name_list = []

for n in range(len(df_import) // 100):
    for r in range(99):
        artist = df_import.iloc[r+(n*100),3]
        track = df_import.iloc[r+(n*100),4]
    
        try:
            spotify_response = sp.search(q='artist:' + artist + ' track:' + track, type='track')           
            artist_name = spotify_response['tracks']['items'][0]['artists'][0]['name']
            track_name = spotify_response['tracks']['items'][0]['name']
            #unique spotify track id used for audio feature search
            track_id = spotify_response['tracks']['items'][0]['uri']           
            #splits string to search for features
            track_id_split = str.split(track_id, 'spotify:track:')
            track_id_list.append(track_id_split[1])          
            artist_name_list.append(artist)          
            track_name_list.append(track)
            
        except:
            DNF_song_search = sp.search(q=track)
            artist_name = DNF_song_search['tracks']['items'][0]['artists'][0]['name']
            
            if search(artist_name, artist):     
                track_name = DNF_song_search['tracks']['items'][0]['name']
                track_id = DNF_song_search['tracks']['items'][0]['uri']
                track_id_split = str.split(track_id, 'spotify:track:')
                track_id_list.append(track_id_split[1])
                artist_name_list.append(artist)
                track_name_list.append(track)
                
            else:
                print('Inconsistent artist match on: ' + artist + ' ' + artist_name + ' for song ' + track)

features_df = pd.DataFrame()
for num in range(len(track_id_list) // 100 + 1):
    features = sp.audio_features(track_id_list[(num*100):(num+1)*100])
    features_df = features_df.append(pd.DataFrame(features))

#add artist and song columns from imported billboard df
features_df['Artist'] = artist_name_list
features_df['Song'] = track_name_list

#combine the two dataframes
df_merged = pd.merge(df_import, features_df.drop_duplicates(), on = 'Song', how = 'left')

df_merged.to_csv('mergedv2.csv')

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 2017-11-28
    • 2013-09-02
    • 2019-03-19
    • 2018-08-03
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多