2015-08-05 8 views
2

Я ему следующие панд dataframe:вычислить среднее количество уникальных комбинаций в GroupBy панд

data = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' :[2,1,2,1,2,1,2,1]}) 

, который выглядит как:

 A  B C 
0 foo one 2 
1 bar one 1 
2 foo two 2 
3 bar three 1 
4 foo two 2 
5 bar two 1 
6 foo one 2 
7 foo three 1 

Что мне нужно, чтобы вычислить среднее каждой уникальной комбинации A и B. то есть:

A  B C 
foo one 2 
foo two 2 
foo three 1 

mean = 1.66666667 

и имеющий в качестве выходного сигнала 'меня анс вычисляется по значению из A т.е .:

foo 1.666667 
bar 1 

Я попытался с:

data.groupby(['A'], sort=False, as_index=False).mean() 

но он возвращает меня:

foo 1.8 
bar 1 

Есть ли способ вычислить mean of only unique combinations? Как ?

ответ

1

Это, по существу, такой же, как @ ответ S_A, но немного более кратким.

Вы можете рассчитать средства через и B с:

In [41]: df.groupby(['A', 'B']).mean() 
Out[41]: 
      C 
A B  
bar one 1 
    three 1 
    two 1 
foo one 2 
    three 1 
    two 2 

А затем вычислить среднее из них более A с:

In [42]: df.groupby(['A', 'B']).mean().groupby(level='A').mean() 
Out[42]: 
      C 
A    
bar 1.000000 
foo 1.666667 
+0

Хм хорошо. Это тоже работа. Может быть, я получаю голос –

+0

@S_A Да, согласен. Ваш ответ так же достоин, как и мой. – LondonRob

0

Это работало для меня

test = data 

test = test.drop_duplicates() 
test = test.groupby(['A']).mean() 

Выход:

  C 
    A    
bar 1.000000 
foo 1.666667 
+0

Осторожно! Я думаю, что опция 'drop_duplicates' работает только здесь, потому что вы * бываете *, чтобы иметь только одинаковые значения, например. '('foo', 1)'. Если у вас было третье значение '('foo', 1)', это испортило бы первое среднее! – LondonRob

1

Да. Вот решение, которое вы хотите. Во-первых, вы создаете соответствующую колонку группы для создания уникальной комбинации A and B column. Позже от создания группы, вы считаете mean() соответствующей колонке A.

Вы можете сделать это, как:

from pandas import * 
data = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' :[2.0,1,2,1,2,1,2,1]}) 
data = data.groupby(['A','B'], sort=False, as_index=False).mean() 
print data.groupby('A', sort=False, as_index=False).mean() 

Выход:

 A   C 
0 foo 1.666667 
1 bar 1.000000 

Когда вы data.groupby(['A'], sort=False, as_index=False).mean() сделать, это означает, что вы рассчитывать group_by все значение C column согласно A Column. Вот почему это вернуть

foo 1.8 (9/8) 
bar 1.0 (3/3) 

Я думаю, вы должны найти ответ на свой вопрос :) :)

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