2017-01-21 2 views
2

мне пришлось обработать этот опрос результат в Tableau, то я думал, что следующая предварительная обработка лучше всего сделать с помощью комбинации Python/панд.Сведения данных обследования с использованием Пандой

Вход:

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 

(.. Этот фиктивный образец фактического обследования сотни дней, и много различных типов ответов)

ли есть ли прямое решение для этого?

ответ

3

Вы можете использовать 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():

(df.set_index("User").stack() 
    .rename_axis(("User", "Question")) 
    .rename("Answer").reset_index()) 

Out[248]: 
    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 
+0

H oly molly, люди Пандаса потратили много времени на поле. Я НЕ ожидал ответа на один ответ на этот вопрос !!! –

+1

@AjeetGanga Хм. Быть прост в использовании, безусловно, является одним из его преимуществ, но освоить все трюки, чтобы добраться туда, где вы хотите, тем не менее, еще некоторое время и практика. – Psidom

1

использованием 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 
+0

df.values ​​[]. Ravel - секретный соус! –

Смежные вопросы