2015-06-05 2 views
1

Я новый пользователь панд. Я прошел через справочные документы и пробовал различные эксперименты (groupby(), multiindex, value_cuounts()). Но я не могу получить желаемый конечный результат.pandas: проблема преобразования данных в агрегированный dataframe

Мой dataframe выглядит следующим образом (это время индексируется):

DATE, GROUP, X, Y, STATUS 
2014-01-01 A 0 0 PASS 
2014-01-01 A 0 1 FAIL 
2014-01-01 A 1 0 PASS 
2014-01-02 B 0 0 PASS 
2014-01-02 B 0 1 PASS 
2014-01-02 B 1 1 FAIL 
.... 

В столбце 'Статус' имеет DTYPE = категории. Я хотел бы закончить с новым dataframe, который выглядит следующим образом:

DATE GROUP STATUS PCT 
2014-01-01 A PASS 0.667 
2014-01-01 A FAIL 0.333 
2014-01-02 B PASS 0.667 
2014-01-02 B FAIL 0.333 

По существу, для каждой группы, я хочу, чтобы вычислить% всего состояния.

Я пробовал df.groupby ('GROUP'). Value_counts(), за которым следует деление на sum() для вычисления процентов. Это работает нормально. Тем не менее, я теряю индексную информацию, и я не знаю, чтобы добавить ее в новый dataframe для достижения желаемого результата выше. В пандах должен быть какой-то простой способ сделать это, но я этого не вижу.

Любые предложения приветствуются. Благодарю.

+0

Что такое "информация о индексе"? Это в приведенном выше примере? –

+0

Является ли это группой просто «группой»? В этом случае каждая группа имеет ровно одну дату? Если нет, то это должно быть группа по «дате» и «группе» – ShikharDua

+0

Индекс - это «ДАТА». Как я уже упоминал, данные индексируются по дате. Также каждая группа имеет ровно одну дату. Данные для группы поступают один раз в день (дискриминатор - X, Y), а имя группы не повторяется позднее (т. Е. Оно уникально). – user4979733

ответ

0

Я бы выполнить groupby на «ДАТА» и «группа» столбцов, а затем вызвать transform на колонке «Статус» и вызовите value_counts/count, transform возвращает ряд выровненной к вашему ориг ФР, так что позволяет чтобы добавить его как новую колонку:

In [64]: 

df['PCT'] = df.groupby(['DATE','GROUP'])['STATUS'].transform(lambda x: x.value_counts()/x.count()) 
df 
Out[64]: 
     DATE GROUP X Y STATUS  PCT 
0 2014-01-01  A 0 0 PASS 0.6666667 
1 2014-01-01  A 0 1 FAIL 0.3333333 
2 2014-01-01  A 1 0 PASS 0.6666667 
3 2014-01-02  B 0 0 PASS 0.6666667 
4 2014-01-02  B 0 1 PASS 0.3333333 
5 2014-01-02  B 1 1 FAIL 0.6666667 
+0

Спасибо, что работает. Я могу сделать drop ['X', 'Y'], а затем drop_duplicates(), чтобы получить нужный формат. – user4979733