Pandas 转置到新列

Pandas transpose to new columns

我有以下来自 Microsoft 表单的数据框,我正在使用 Python 从 Sharepoint 网站下载,我需要保存到我们的本地数据库以供进一步分析。

输入方向:

ID  Q1  Q2  QN
1   1   1   0
2   1   1   1
3   0   0   1
4   0   1   0

请注意,目前有 50 多列和数百行,但会随着时间的推移而增加。

在将数据发送到 SQL 服务器之前,我想转置数据帧,以便对数据库存储进行规范化。我想要得到的输出如下:

输出方向:

ID  Question    Answer
1   Q1          1
1   Q2          1
1   QN          0
2   Q1          1
2   Q2          1
2   QN          1
3   Q1          0
3   Q2          0
3   QN          1
4   Q1          0
4   Q2          1
4   QN          0

我知道使用 df.T 简单地将列转换为行我不会得到太多;谁能解决一些可能的方法? 即使使用普通 Python lists/dictionaries 或其他内容,也不一定需要使用 pandas 处理。 谢谢

您可以使用 melt:

df_new = df.set_index("ID").melt(var_name="Question", value_name="Answer", ignore_index=False).sort_index()

输出:

   Question  Answer
ID
1        Q1       1
1        Q2       1
1        QN       0
2        Q1       1
2        Q2       1
2        QN       1
3        Q1       0
3        Q2       0
3        QN       1
4        Q1       0
4        Q2       1
4        QN       0

与@anon01 的回答略有不同的方法是在 df.melt 中使用 id_var 参数,而不是显式设置索引 (documentation)。

df.melt('ID', ['Q1','Q2','QN'], 'Question', 'Answer')
    ID Question  Answer
0    1       Q1       1
1    2       Q1       1
2    3       Q1       0
3    4       Q1       0
4    1       Q2       1
5    2       Q2       1
6    3       Q2       0
7    4       Q2       1
8    1       QN       0
9    2       QN       1
10   3       QN       1
11   4       QN       0