Измените формат 1d CSV на 2D CSV с помощью панд

#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 Способ оформления заказа в панд.