我正在使用推荐系统程序。鉴于此数据框,如何基于interval列的值创建30条随机轨道的列表?
MyDrawerContent
track_name track_artist liveness valence tempo duration_ms intervals
Pangarap Barbie's Cradle 0.088700 0.566000 97.091000 235440 0
I Feel Alive Steady Rollin 0.347000 0.404000 135.225000 373512 -1
Poison Bell Biv DeVoe 0.489000 0.650000 111.904000 262467 -1
Baby CeeLo Green 0.066400 0.405000 118.593000 243067 -2
Dumb Litty KARD 0.138000 0.240000 130.018000 193160 0 ```
每当我尝试此代码时,都会出现此错误:
for i in spotify:
lista=[]
if spotify['intervals'].values ==-1:
lista.append(random(spotify['track_id']['track_name']))
if spotify['intervals']. ==-2:
lista.append(random(spotify['track_id']['track_name']))
if spotify['intervals'].item ==0:
lista.append(random(spotify['track_id']['track_name']))
print(lista)
```
答案 0 :(得分:1)
这是因为您正在将数组spotify['intervals'].values
与值-1比较。您需要查找它们是否等于该值。您可以这样做-
any(spotify['intervals'].values)==-1
对于您所有的elif
条件,依此类推
编辑: 问题比您面临的问题更深。您正在尝试从间隔创建的组中提取n首随机歌曲,然后将其返回。可以使用groupby来完成,然后使用带有random.choice-
的apply函数n = 10 #number of random tracks you need
dd = pd.DataFrame(spotify.groupby(['intervals'])['track_name'].apply(list)).reset_index() #group and get list of songs by intervals
#get n random songs
dd['random_track'] = dd['track_name'].apply(np.random.choice, size=(n,))
dd
intervals track_name random_track
0 -1 [I Feel Alive, Poison] Poison
1 0 [Pangarap] Pangarap
第一列是间隔,第二列是所有歌曲的列表,第三列是列表中的随机歌曲。
这应该可以解决您的问题。请阅读有关pandas groupby操作的信息。
答案 1 :(得分:1)
要从时间间隔列中的每个值中获取随机样本,您可以遍历每个唯一值,过滤数据框,然后保存到字典中。
import pandas as pd
df = pd.read_csv("xxxx.csv")
output = {}
for unique in df["intervals"].unique():
output[unique] = df[df["intervals"] == unique].sample(30)
或创建一个函数,该函数还处理计数低于所需样本量的子集。
def get_unique_sample(df, sample_size=30):
output = {}
for unique in df["intervals"].unique():
subset = df[df["intervals"] == unique]
samplesize = 30 if len(subset) > 30 else len(subset)
output[unique] = subset.sample(samplesize )
return output