2016-01-06 4 views
2

Вдохновленный сообщением this, я хотел бы получить отдельный счетчик значения в кадре данных для каждой группы и создать столбец с отдельными значениями счета в кадре данных. Как это:Pandas column count

Оригинальный кадр данных:

import pandas as pd 
df = pd.DataFrame(
    {'A' : ['foo', 'foo', 'foo', 'foo', 
      'bar', 'bar', 'bar', 'bar'], 
    'B' : ['foo', 'fo', 'foo', 'foo', 
     'bar', 'bar', 'ba', 'ba'], 
    'C' : [2, 4, 4, 2, 5, 4, 3, 2]}) 
df 

    A  B  C 
0 foo  foo  2 
1 foo  fo  4 
2 foo  foo  4 
3 foo  foo  2 
4 bar  bar  5 
5 bar  bar  4 
6 bar  ba  3 
7 bar  ba  2 

Метод от связанного поста применяется:

df=df.groupby(['A','B'])['C'].apply(lambda x: len(x.unique())) 
df 

Результат за связанного метода сообщения:

A B 
bar ba  2 
    bar 2 
foo fo  1 
    foo 2 
Name: C, dtype: int64 

Желаемый результат:

A  B  C Distinct Count of C per A and B 
0 foo  foo  2    2 
1 foo  fo  4    1 
2 foo  foo  4    2 
3 foo  foo  2    2 
4 bar  bar  5    2 
5 bar  bar  4    2 
6 bar  ba  3    2 
7 bar  ba  2    2 

Глядя на первую строку, комбинация «foo» в «A» и «foo» в «B» имеет 2 уникальных значения, связанных с ней (2 и 4), в результате чего в каждой строке указано 2 что комбинация значений для столбцов A и B.

Благодарим заранее!

ответ

1

Использование transform вместо apply, потому что возвращать колонку с таким же размером, как оригинал, я не мог найти документацию по оригинальным pandas site для этого, но с помощью:

преобразования (FUNC, * Args, ** kwargs) метод pandas.core.groupby.SeriesGroupBy экземпляра
функции вызовов, производящей как индексированные серии по каждой группе и вернуться Серия с преобразованными значениями

df['Distinct Count of C per A and B'] = df.groupby(['A','B'])['C'].transform(lambda x: len(x.unique())) 

In [1495]: df 
Out[1495]: 
    A B C Distinct Count of C per A and B 
0 foo foo 2        2 
1 foo fo 4        1 
2 foo foo 4        2 
3 foo foo 2        2 
4 bar bar 5        2 
5 bar bar 4        2 
6 bar ba 3        2 
7 bar ba 2        2