数据框列值列表

时间:2020-07-29 13:54:07

标签: python numpy-ndarray

我正在使用推荐系统程序。鉴于此数据框,如何基于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)
``` 

2 个答案:

答案 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