Панды поворачивают один столбец, используя то же значение столбца, что и заголовки столбцов

1

Я хочу повернуть столбец в фрейме данных, где значения столбцов становятся заголовком столбца, а фактическое значение для этих столбцов становится равным 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.

Теги:
pandas

1 ответ

1
Лучший ответ

Вы хотите полагаться только на 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню