You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:48:04