#python #pandas
#питон #панды
Вопрос:
У меня есть csv-файл, сформированный следующим образом:
movie_id | рейтинги |
---|---|
1 | [{‘идентификатор пользователя’: 1, «звезда»:» 5″}, {‘идентификатор пользователя’: 3,» звезда»:» 4″}, {‘идентификатор пользователя’: 2,» звезда»: «3»}] |
2 | [{‘идентификатор пользователя’: 1, «звезда»: «4»}, {‘идентификатор пользователя’: 2, «звезда»: «3»}, {‘идентификатор пользователя’: 3, «звезда»: «5»}] |
который я хочу преобразовать в:
идентификатор пользователя_1 | customer_id_2 | идентификатор пользователя_3 | |
---|---|---|---|
movie_id_1 | 5 | 4 | 3 |
movie_id_2 | 4 | 3 | 5 |
Как это можно сделать с помощью панд python ?
Комментарии:
1. Действительно ли
[
в вашем первом ряду есть квадратная скобкаratings
?2. @9769953 Да, у меня есть правка, это список.
3. Пожалуйста, не изменяйте данные, так как это приведет в замешательство нового пользователя, который посетит ваш вопрос. Пожалуйста, добавьте изменения в данные в качестве постскриптума к вашему вопросу @hajuha
Ответ №1:
Разнесите фрейм данных по рейтингам и примените ряды к столбцу словаря. Формат удлиненной строки лучше подходит для манипуляций, чем тот, который вы указали.
df = df.explode('ratings') df[['customer_id', 'star']] = df.ratings.apply(pd.Series)
Выход
movie_id ratings customer_id star 0 1 {'customer_id': 1, 'star': '5'} 1 5 0 1 {'customer_id': 3, 'star': '4'} 3 4 0 1 {'customer_id': 2, 'star': '3'} 2 3 1 2 {'customer_id': 1, 'star': '4'} 1 4 1 2 {'customer_id': 2, 'star': '3'} 2 3 1 2 {'customer_id': 3, 'star': '5'} 3 5
Если вам все еще нужен ваш формат, следуйте приведенному ниже коду
df.drop(columns=['ratings']).set_index(['movie_id', 'customer_id']).unstack(['customer_id'])
Вывод (Многоиндексный фрейм данных)
star customer_id 1 2 3 movie_id 1 5 3 4 2 4 3 5
Если для клиента и/или фильма отсутствует звездная ценность. Использование fillna
поможет.
df.drop(columns=['ratings']).set_index(['movie_id', 'customer_id']).unstack(['customer_id']).fillna(0)
Комментарии:
1. Что делать, если не каждый фильм оценивается всеми клиентами? Как я могу добавить значение 0 по умолчанию для отсутствующих значений ?
2. Об этом в вопросе не упоминается. Следовательно, я не рассматривал это.
fillna
Способ оформления заказа в панд.