Заполнение строки данных Pandas набором данных с помощью apply - PullRequest
0 голосов
/ 26 мая 2018

У меня очень простой фрейм данных для тестирования.Это выглядит так:

movieId | title     | genres              | Drama | Action | Comedy
1       | Toy Story | {'Drama', 'Comedy'} | 0     | 0      | 0

Я хочу отразить набор genres в логических значениях в соответствующих столбцах, поэтому желаемый результат будет:

movieId | title     | genres              | Drama | Action | Comedy
1       | Toy Story | {'Drama', 'Comedy'} | 1     | 0      | 1

Итак, я попробовал этокод с apply:

def ttb(genreset):                                                
    return tuple(1 if g in genreset else 0 for g in all_genres)

all_genres = ('Drama', 'Action', 'Comedy')

df.T.loc[all_genres, :] = df.apply(lambda x: ttb(x.loc['genres']), axis=1) 

Но это привело к ошибке, которую я действительно не могу обернуть:

ValueError: shape mismatch: value array of shape (19,) could not be broadcast to indexing result of shape (19,1)

Нужно ли как-топриведите возвращаемое значение apply к фиксированному размеру или почему это не работает так, как я ожидал?Я также пытался использовать больше данных, но всегда получал одну и ту же ошибку.Поиск в Google по ошибке дал много результатов, но не предложил для меня жизнеспособных решений.

1 Ответ

0 голосов
/ 26 мая 2018

Вызов str.join, за которым следует str.get_dummies:

v = df.genres.str.join(',').str.get_dummies(sep=',')

Или, если «Действие» необходимо добавить явно, давайте использовать reindex:

v = (df['genre']
     .str.join(',')
     .str.get_dummies(sep=',')
     .reindex(
         ['Comedy', 'Action', 'Drama'], 
         axis=1, 
         fill_value=0
     )
)

print(v)
   Comedy  Action  Drama
0       1       0      1

Еслиу вас есть много уникальных значений, и вы не уверены, что они есть, вы всегда можете найти их объединение:

u = set().union(*df.genres.tolist())

А теперь используйте u для переиндексации результата.


Если вам нужно добавить это обратно в ваш оригинальный DataFrame, используйте concat:

df = pd.concat([df, v], axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...