Содержит панды поиска - PullRequest
0 голосов
/ 14 января 2019

Пожалуйста, помогите, мне нужно создать новый столбец. Если мой столбец Жанры, который является списком, содержит значение.

если Genres содержит: lookuptable ['first'] и lookuptable ['second']

Из таблицы поиска возвращает соответствующее значение. Я перепробовал много методов, еще не знакомых с Python, надеясь, что я был близок

Возврат: lookuptable ['mid-genre']

Таблица поиска

dh - кадр данных ниже

sub-genre   first   second  mid-genre   genre
indie       indie           Alternative rock
dream pop   dream   pop     Alternative rock
shoegaze    shoegaze        Alternative rock
post-hardcore post hardcore HardcorePunk rock
emo          emo            HardcorePunk rock
screamo     screamo         HardcorePunk rock
synthcore   synthcore       Harcore Punk rock 
rock        rock            Contemporary rock

diy = кадр данных ниже

artist  genres                             New Column
 2:54   ['metropopolis']                    No Genre (blank)
 22     ['norwegian rock']                  Contemporary
 27     ['boston rock']                     Contemporary
 33     []                                  No Genre (blank)
 36     ['ambient', 'compositional ambient', 'drift', ...
 44     ['emo', 'pop punk', 'skate punk']   Hardcore Punk
 52     []
 68     []
 83     ['hip hop quebecois']               Hip hop

Попытки кода ниже

diy = pd.DataFrame(data[['artist','genres']])

for i in diy['genres'].iteritems():
    for x, y, z, t in zip(dh['first'], dh['second'],dh['mid-genre'],dh['genre']):
        if h.str.contains(x) and h.str.contains(z):
            diy['mid-genre'] = z
            diy['Main-genre'] = t

Сообщение об ошибке

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

2-я попытка, я добавил .any () в оператор IF, чтобы попытаться обработать исключение:

if h.str.contains(x).any() and h.str.contains(z).any():
UserWarning: This pattern has match groups. To actually get the groups, use str.extract.

1 Ответ

0 голосов
/ 16 января 2019

Я нашел решение на случай, если у кого-то еще есть подобная задача.

import re
diy = pd.DataFrame(data[['artist','genres']])

omg = []  # Create container for new values

# Zip lookup table to Loop through strings (Pattern to look for)
for x, y, z, t in zip(lookup['first'], lookup['second'],lookup['mid-genre'],lookup['genre']):
    # convert X and Y to Regular expression pattern
    p = re.compile(x)   
    q = re.compile(str(y)) 

    # Loop through Data    
    for i, k in zip(diy['artist'],diy['genres']):

        # Create and store match object (RegEx object)
        m = p.search(str(k))
        j = q.search(str(k))

        # If M and J both match diy['genre']
        if (m and j):
            woo = (i, z, t)   # Return lookup[['mid-genre','Main-genre']]
            omg.append(woo)   # Append to container
        else:
            # If no match label No genre
            woo = (i,'No genre','No genre') 
            omg.append(woo)
...