Как изменить значения (которые являются списками) в Python Data Frame в зависимости от условия? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть DataFrame 'songDataFrame' с информацией о песнях.Есть три столбца: 'Artist', 'Title', 'Genres' .Первые два являются строковыми и 'genres' содержит списки жанров.Выглядит это так:

id  artist             title         genres
1   'Sarah Bareilles'  'Opening Up'  ['acoustic','pop', 'piano']
2   'Post Malone'      'Stay'        ['Hip-Hop', 'rap', 'trap']
3   'Dean Lewis'       'Waves'       ['alternative', 'guitar', 'indie']
4   'Billie Eilish'    'Watch'       ['indie', 'indie pop', 'pop']
5   'Passenger'        'Let Her Go'  ['metal', 'screamo', 'gore']

Жанры для художника 'Пассажир' неверны.Я хочу изменить существующий список на ['инди-рок', 'фолк-рок'].

Если бы это был не список, но я заменял собой строку, я бы просто сделал:

mask = songDataFrame.artist =='Passenger'
songDataFrame.loc[mask, 'genres'] = 'indie folk'

Таким образом, он работает нормально.Когда вместо «инди-фолк» я ставлю [«инди-рок», «фолк-рок»],

mask = songDataFrame.artist =='Passenger'
songDataFrame.loc[mask, 'genres'] = ['indie folk','folk rock']

я получаю эту ошибку:

ValueError: Must have equal len keys and value when setting with an iterable

Есть ли способ решитьчто?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Без дополнительного пакета и трюка literal_eval:

mask = (songDataFrame.artist == 'Passenger').tolist().index(True)
songDataFrame.at[mask, 'genres'] = ['indie folk','folk rock']
0 голосов
/ 16 декабря 2018

Используйте две строки и используйте loc для назначения строки, сделайте все значения столбцов строковыми, а затем верните их в список:

import ast
songDataFrame.loc[songDataFrame['artist']=='Passenger','genres']="['indie folk','folk rock']"
songDataFrame['genres']=songDataFrame['genres'].astype(str).apply(ast.literal_eval)

А теперь:

print(songDataFrame)

Is:

   id           artist       title                        genres
0   1  Sarah Bareilles  Opening Up        [acoustic, pop, piano]
1   2      Post Malone        Stay          [Hip-Hop, rap, trap]
2   3       Dean Lewis       Waves  [alternative, guitar, indie]
3   4    Billie Eilish       Watch       [indie, indie pop, pop]
4   5        Passenger  Let Her Go       [indie folk, folk rock]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...