Как частично транспонировать DataFrame?

Имеется такой DataFrame:

df = pd.DataFrame(((1, 'Vasya', 13, 'Да', 'Было щекотно'),), columns=('user_id', 'user_name', 'poll_id', 'Тебе понравилось?', 'Дай комментарий'))
| user_id | user_name | poll_id | Тебе понравилось? | Дай комментарий |
| --- | --- | --- | --- | --- |
| 1 | Vasya | 13 | Да | Было щекотно |

А нужно его преобразовать в такой:

tdf = pd.DataFrame(((1, 'Vasya', 13, 'Тебе понравилось?', 'Да'), (1, 'Vasya', 13, 'Дай комментарий', 'Было щекотно')), columns=('user_id', 'user_name', 'poll_id', 'Вопрос', 'Ответ'))
user_id user_name poll_id Вопрос Ответ
0 1 Vasya 13 Тебе понравилось? Да
1 1 Vasya 13 Дай комментарий Было щекотно

Но пока не выходит. Прошу подсказать, как это делается.

PS. В реальной таблице вспомогательных информационных полей намного больше. Но суть та же - нужно столбцы с вопросами разбить построчно, как в примере.


Ответы (1 шт):

Автор решения: MaxU

Воспользуйтесь методом DataFrame.stack():

res = (df
       .set_index("user_id user_name  poll_id".split())
       .stack()
       .reset_index()
       .rename(columns={"level_3":"Вопрос", 0:"Ответ"}))

результат:

In [146]: res
Out[146]:
   user_id user_name  poll_id             Вопрос         Ответ
0        1     Vasya       13  Тебе понравилось?            Да
1        1     Vasya       13    Дай комментарий  Было щекотно
→ Ссылка