2013-07-29 15 views
19

Mam ramkę danych pandy i pogrupuję ją według dwóch kolumn (na przykład col1 i col2). Dla ustalonych wartości col1 i col2 (tj. Dla grupy) mogę mieć kilka różnych wartości w col3. Chciałbym policzyć liczbę odrębnych wartości z trzeciej kolumny.Jak zliczać różne wartości w kolumnie grupy pand według obiektu?

Na przykład, jeśli mam to jako mój wkład:

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 

Chciałbym mieć tę tabelę (ramki danych) jako wyjście:

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

pokrewne tematem jest [.value_counts()] (https://stackoverflow.com/questions/20076195/what-jest-najwykle-pewne-way-of-counting-occurrences-in-pandas#20076611) – cardamom

Odpowiedz

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

interestin gly 'nunique' wydaje się dwa razy wolniejsze niż odpowiedź Jeffa. –

+0

Weird! Widzę to również. Groupby może przyjmować tu niewłaściwą tak zwaną ścieżkę - logika, która stosuje funkcje do grup, jest dość gęsta. –

+2

jest więcej narzutów z wywołaniem '' value_count'' (który musi zrekonstruować serię) w każdej grupie (zamiast '' unique'', który właśnie zwraca ndarray). W rzeczywistości może to być nietrywialne. Jeśli nie potrzebujesz indeksów wewnątrz funkcji, możesz często uniknąć tej kary (nie tworząc instancji serii, która ma wartość value_counts, a następnie zostanie odrzucona, ponieważ potrzebujesz tylko jej len). – 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 
Powiązane problemy