Python 使用熊猫展平测量数据

Python 使用熊猫展平测量数据,python,pandas,Python,Pandas,我必须在Tableau中处理这个调查结果,然后我认为下面的预处理最好使用Python/Pandas组合完成 输入: User Day-1 Day-2 Day-3 1 Good Good Bad 2 Good Ok Ok 3 Good Ok Ok 4 Bad Bad Good 5

我必须在Tableau中处理这个调查结果,然后我认为下面的预处理最好使用Python/Pandas组合完成

输入:

  User      Day-1       Day-2   Day-3
    1       Good        Good    Bad
    2       Good        Ok      Ok
    3       Good        Ok      Ok
    4       Bad         Bad     Good
    5       Ok          Bad     Bad
预期产出:

User Question       Answer
1   Day-1           Good
1   Day-2           Good
1   Day-3           Good
2   Day-1           Bad
2   Day-2           Ok
2   Day-3           Good
3   Day-1           Ok
3   Day-2           Ok
3   Day-3           Bad
4   Day-1           Bad
4   Day-2           Bad
4   Day-3           Ok
5   Day-1           Ok
5   Day-2           Good
5   Day-3           Bad
(这是一个虚拟样本。实际的调查有数百天的时间,有许多不同类型的答案。)


有什么直接的解决办法吗

您可以使用pandas.melt将数据从宽格式转换为长格式:

import pandas as pd
pd.melt(df, id_vars="User", var_name = "Question", value_name="Answer")

Out[246]:
  User  Question  Answer
0   1   Day-1   Good
1   2   Day-1   Good
2   3   Day-1   Good
3   4   Day-1   Bad
4   5   Day-1   Ok
5   1   Day-2   Good
6   2   Day-2   Ok
7   3   Day-2   Ok
8   4   Day-2   Bad
9   5   Day-2   Bad
10  1   Day-3   Bad
11  2   Day-3   Ok
12  3   Day-3   Ok
13  4   Day-3   Good
14  5   Day-3   Bad

另一个选项是使用
stack()


使用
numpy

pd.DataFrame(dict(
        User=df.User.values.repeat(len(df.columns) - 1),
        Question=np.tile(df.columns[1:], len(df.index)),
        Answer=df.values[:, 1:].ravel()
        ))[['User', 'Question', 'Answer']]

    User Question Answer
0      1    Day-1   Good
1      1    Day-2   Good
2      1    Day-3    Bad
3      2    Day-1   Good
4      2    Day-2     Ok
5      2    Day-3     Ok
6      3    Day-1   Good
7      3    Day-2     Ok
8      3    Day-3     Ok
9      4    Day-1    Bad
10     4    Day-2    Bad
11     4    Day-3   Good
12     5    Day-1     Ok
13     5    Day-2    Bad
14     5    Day-3    Bad

天哪,莫莉,熊猫人在野外已经呆了很长时间了。我没想到这个问题会有一行答案@AjeetGanga嗯。简单易用肯定是它的优势之一,但要掌握所有技巧以达到你想要的目的,仍然需要一些时间和练习。df.values[]。ravel是秘方!
pd.DataFrame(dict(
        User=df.User.values.repeat(len(df.columns) - 1),
        Question=np.tile(df.columns[1:], len(df.index)),
        Answer=df.values[:, 1:].ravel()
        ))[['User', 'Question', 'Answer']]

    User Question Answer
0      1    Day-1   Good
1      1    Day-2   Good
2      1    Day-3    Bad
3      2    Day-1   Good
4      2    Day-2     Ok
5      2    Day-3     Ok
6      3    Day-1   Good
7      3    Day-2     Ok
8      3    Day-3     Ok
9      4    Day-1    Bad
10     4    Day-2    Bad
11     4    Day-3   Good
12     5    Day-1     Ok
13     5    Day-2    Bad
14     5    Day-3    Bad