Как разбить данные в pandas?

Javier López Tomás спросил: 13 июня 2018 в 03:27 в: python

У меня есть этот фреймворк данных:

                Excercise A  Excercise B   Excercise x   Group  Sex
Person 1           1           4               ...         A     F
Person 2           2           5               ...         B     F
Person i           3           5               ...         C     M

Для пояснения причин здесь пример моего реального набора данных в Excel: пример набора данных. Столбец "Gimnasta" может быть либо индексом, либо нормальным столбцом, хотя я считаю его индексом. "Plancha" и "Staddler" - это столбцы упражнений, а еще 17 скрытых в снимке. "Grupo" и "Sexo" - это "Группа" и "Секс" соответственно.

Этот кадр данных должен быть "дезагрегирован", чтобы сделать ройный сюжет для каждого упражнения. Это будет пример того, что мне нужно:

                Excercise   Score      Group  Sex
Person 1           A           1        A     F
Person 1           B           4        A     F
Person i           C           X        C     M

Пример в Excel: окончательный набор данных

Я следил за следующим tutorial: Pandas: создание строк данных из другой информации dataframe Однако я застрял из-за различий между двумя примерами.

Я разделил свой оригинальный df в два для облегчения процесса (или это то, что я думаю) с помощью следующего кода:

df = pd.read_csv("data.csv",index_col=0)
df2 = df[['Group','Sex']]
df3 = df.drop(df[['Group','Sex']],axis=1)
series = df3.stack()

Итак, мы имеем df2, содержащий только столбцы группы и пола и df3, содержащие все упражнения с их оценками, оба блока данных с столбцом "Gimnasta" в качестве индекса, чтобы облегчить идентификацию значений для каждой gimnast позже.

Я не знаю, как продолжить.


2 ответа

Есть решение
Dickster ответил: 13 июня 2018 в 04:31

Согласитесь с Биллом, мы немного угадали. Я думаю, что в конечном итоге будет работать подход с использованием .melt ().

data = {u'Exercise A': {0: 1L, 1: 2L, 2: 3L},
 u'Exercise B': {0: 4L, 1: 5L, 2: 5L},
 u'Group': {0: u'A', 1: u'B', 2: u'C'},
 u'Person': {0: u'Person1', 1: u'Person2', 2: u'Person1'},
 u'Sex': {0: u'F', 1: u'F', 2: u'M'}}df = pd.DataFrame(data)    Exercise A  Exercise B  Group   Person  Sex
0   1           4           A       Person1 F
1   2           5           B       Person2 F
2   3           5           C       Person1 Mdf = pd.melt(df, id_vars=['Person','Group','Sex'], value_vars=['Exercise A', 'Exercise B'],var_name='Exercise', value_name='Score')
df = df.sort_values(['Person','Group'])    Person  Group   Sex Exercise    Score
0   Person1 A       F   Exercise A  1
3   Person1 A       F   Exercise B  4
2   Person1 C       M   Exercise A  3
5   Person1 C       M   Exercise B  5
1   Person2 B       F   Exercise A  2
4   Person2 B       F   Exercise B  5
Dickster ответил: 13 июня 2018 в 04:41

Если вы хотите перейти по пути .stack ().

data = {u'Exercise A': {0: 1L, 1: 2L, 2: 3L},
 u'Exercise B': {0: 4L, 1: 5L, 2: 5L},
 u'Group': {0: u'A', 1: u'B', 2: u'C'},
 u'Person': {0: u'Person1', 1: u'Person2', 2: u'Person1'},
 u'Sex': {0: u'F', 1: u'F', 2: u'M'}}df = pd.DataFrame(data)    Exercise A  Exercise B  Group   Person  Sex
0   1           4           A       Person1 F
1   2           5           B       Person2 F
2   3           5           C       Person1 Mdf = df.set_index(['Person','Sex','Group'])
df.stack()Person   Sex  Group            
Person1  F    A      Exercise A    1
                     Exercise B    4
Person2  F    B      Exercise A    2
                     Exercise B    5
Person1  M    C      Exercise A    3
                     Exercise B    5
dtype: int64which is a series with a 4 level multi_index() where the inner level is 'None'.names = [x for x in  df.index.names]
names[-1] ='Exercise'
df.index.names = names
df.to_frame('Score')                                Score
Person  Sex Group   Exercise    
Person1 F   A       Exercise A  1
                    Exercise B  4
Person2 F   B       Exercise A  2
                    Exercise B  5
Person1 M   C       Exercise A  3
                    Exercise B  5

здесь вы можете сбросить_индекс ().

Дополнительное видео по вопросу: Как разбить данные в pandas?

vigenere (C)

CS50 2016 Неделя 7 Машинное обучение русский пеервод CS50 2016 Week 7 Machine Learning rus