2013-07-29 3 views
19

У меня есть кадр данных pandas и сгруппируйте его по двум столбцам (например, col1 и col2). При фиксированных значениях col1 и col2 (т. Е. Для группы) я могу иметь несколько разных значений в col3. Я хотел бы подсчитать количество различных значений из третьих столбцов.Как подсчитать различные значения в столбце группы pandas по объекту?

Например, если у меня есть это как мой вход:

1 1 1 
1 1 1 
1 1 2 
1 2 3 
1 2 3 
1 2 3 
2 1 1 
2 1 2 
2 1 3 
2 2 3 
2 2 3 
2 2 3 

Я хотел бы иметь эту таблицу (кадр данных) в качестве выхода:

1 1 2 
1 2 1 
2 1 3 
2 2 1 
+0

родственный тема [.value_counts()] (https://stackoverflow.com/questions/20076195/what-is-the-most-efficient-way-of-counting-occurrences-in-pandas#20076611) – cardamom

ответ

22
df.groupby(['col1','col2'])['col3'].nunique().reset_index() 
+1

interestin gl 'nunique' кажется в два раза медленнее, чем ответ Джеффа. –

+0

Странно! Я тоже это вижу. Groupby может принимать неправильный так называемый путь здесь - логика, которая применяет функции к группам, довольно плотная. –

+2

есть дополнительные накладные расходы с вызовом '' value_count'' (который должен восстанавливать серию) для каждой группы (а не '' unique'', которые просто возвращают ndarray). Это фактически может быть нетривиальным. Если вам не нужны индексы внутри функции, вы можете часто избегать этого штрафа (не создавая экземпляр серии, которые делают value_counts, а затем отбрасываются, потому что все, что вам нужно, это ее длина) – Jeff

20
In [17]: df 
Out[17]: 
    0 1 2 
0 1 1 1 
1 1 1 1 
2 1 1 2 
3 1 2 3 
4 1 2 3 
5 1 2 3 
6 2 1 1 
7 2 1 2 
8 2 1 3 
9 2 2 3 
10 2 2 3 
11 2 2 3 

In [19]: df.groupby([0,1])[2].apply(lambda x: len(x.unique())) 
Out[19]: 
0 1 
1 1 2 
    2 1 
2 1 3 
    2 1 
dtype: int64 
Смежные вопросы