Pandas DataFrame遍历与Spotify API分批调用问题求助
Billboard Spotify特征批量查询解决方案
核心实现思路:将全量榜单数据按每100行拆分为多个批次,复用你已验证可用的单批次查询逻辑,逐批次处理后拼接所有结果,避免分批查询时的顺序错位、合并报错问题。
完整可运行代码如下:
import pandas as pd import numpy as np import re # 注意:此处默认你已完成spotipy的身份认证,sp对象可正常调用API df_import = pd.read_csv(r'xxx/Billboard_Top_100.csv') # 按每100行拆分全量数据集为多个批次 batch_size = 100 batches = np.array_split(df_import, np.ceil(len(df_import)/batch_size)) # 存储所有批次的特征结果 all_features = [] for batch_df in batches: track_id_list = [] artist_name_list = [] track_name_list = [] # 遍历当前批次的每一行,复用原有查询逻辑 for item, row in batch_df.iterrows(): artist = row['Artist'] track = row['Song'] try: spotify_response = sp.search(q='artist:' + artist + ' track:' + track, type='track') track_id = spotify_response['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(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 re.search(artist_name, artist): 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(row['Artist']) track_name_list.append(row['Song']) else: print('Inconsistent artist match on: ' + artist + ' ' + artist_name + ' for song ' + track) # 批量查询当前批次的音频特征 features = sp.audio_features(track_id_list) # 过滤API返回的空特征,避免无效ID导致创建DataFrame报错 valid_features = [f for f in features if f is not None] # 生成当前批次的特征DataFrame batch_features_df = pd.DataFrame(data = valid_features) batch_features_df['Artist'] = artist_name_list batch_features_df['Song'] = track_name_list all_features.append(batch_features_df) # 拼接所有批次的特征结果 total_features_df = pd.concat(all_features, ignore_index=True) # 合并特征与原榜单数据,按歌手+歌曲双字段匹配避免重名错误 df_merged = pd.merge(df_import, total_features_df, on = ['Artist', 'Song'], how = 'left') df_merged.to_csv('merged_full.csv', index=False)
常见报错修复说明
- 特征与歌曲对应错位:每批次独立处理对应行的歌曲信息和特征,不会出现列表长度不匹配、顺序错乱问题
- 合并重复/匹配错误:将原代码仅按
Song合并改为同时按Artist和Song双字段匹配,避免重名歌曲匹配错误 - 空特征报错:新增了对API返回空值的过滤逻辑,无效ID不会打断程序运行
内容的提问来源于stack exchange,提问作者steezebutter
相关产品推荐
相关产品推荐

