Я хочу повернуть столбец в фрейме данных, где значения столбцов становятся заголовком столбца, а фактическое значение для этих столбцов становится равным 1
или 0
.
Пример:
movie_id cluster_id answer_id
0 73 1 4
1 80 1 5
4 81 1 2
7 84 1 1
10 88 1 1
11 83 1 4
13 85 1 1
16 54 1 1
22 79 1 3
23 87 1 1
Я хочу, чтобы результат был следующим:
movie_id cluster_id 1 2 3 4 5
0 73 1 0 0 0 1 0
1 80 1 0 0 0 0 1
4 81 1 0 1 0 0 0
Один из способов сделать это: скопировать столбцы answer_id
в другое имя, а затем использовать его в функции pivot_table
. Но не уверен, как можно заполнить или вообще есть лучший способ выполнить это без фактической копии столбца.
pivot_df = df.pivot_table(
values='copy_answer_id',
index=['movie_id', 'cluster_id'],
columns='answer_id').reset_index()
Как только выше сделано, вы получаете все NaN
и содержимое в answer_id
для соответствующих столбцов.
movie_id cluster_id 1 2 3 4 5
0 73 1 NaN NaN NaN 4 NaN
1 80 1 NaN NaN NaN NaN 5
4 81 1 NaN 2 NaN NaN NaN
Тогда я мог бы сделать:
cols = [1,2,3,4,5]
pivot_df[cols] = pivot_df[cols].replace({1:1,2:1,3:1,4:1,5:1})
После этого для преобразования NaN
в нули: я мог бы сделать pivot_df.fillna(0, inplace=True)
чтобы преобразовать все NaN
в нули.
Но есть ли лучший способ сделать это только в функции pivot_table
.
Вы хотите полагаться только на pivot_table
. Вы можете сделать так:
# Use a temporary column with values one, pivot and fill nan with 0
new = df.assign(val=1).pivot_table(columns='answer_id',index=['cluster_id','movie_id'],values='val',fill_value=0).reset_index()
Или вы можете пойти с get_dummies
поскольку он быстрее, чем pivot_table
т. pivot_table
new = pd.concat([df[['movie_id','cluster_id']],pd.get_dummies(df['answer_id'])],1)
movie_id cluster_id 1 2 3 4 5
0 73 1 0 0 0 1 0
1 80 1 0 0 0 0 1
4 81 1 0 1 0 0 0
7 84 1 1 0 0 0 0
10 88 1 1 0 0 0 0
11 83 1 0 0 0 1 0
13 85 1 1 0 0 0 0
16 54 1 1 0 0 0 0
22 79 1 0 0 1 0 0
23 87 1 1 0 0 0 0