2016-03-17 23 views
5

Używając pand, chciałbym policzyć konkretną wartość w kolumnie. Wiem, że użycie df.somecolumn.ravel() da mi wszystkie unikalne wartości i ich liczba.Ale jak uzyskać liczbę określonej wartości.Pandy, Zliczanie pojedynczej wartości w kolumnie ramki danych

In[5]:df 
Out[5]: 
     col 
     1 
     1 
     1 
     1 
     2 
     2 
     2 
     1 

Pożądany:

To get count of 1. 

    In[6]:df.somecalulation(1) 
    Out[6]: 5 

    To get count of 2. 

    In[6]:df.somecalulation(2) 
    Out[6]: 3 
+0

Czy jesteś optymistą zing to dla wielu zapytań lub dla małego (lub pojedynczego) zapytania? –

+0

Pojedyncze małe zapytanie. – Randhawa

+0

zobacz odpowiedź, a następnie. –

Odpowiedz

9

Można spróbować value_counts:

df = df['col'].value_counts().reset_index() 
df.columns = ['col', 'count'] 
print df 
    col count 
0 1  5 
1 2  3 

EDIT:

print (df['col'] == 1).sum() 
5 

Lub:

def somecalulation(x): 
    return (df['col'] == x).sum() 

print somecalulation(1) 
5 
print somecalulation(2) 
3 

Lub:

ser = df['col'].value_counts() 

def somecalulation(s, x): 
    return s[x] 

print somecalulation(ser, 1) 
5 
print somecalulation(ser, 2) 
3 

EDIT2:

Jeśli potrzebujesz czegoś naprawdę szybki, użyj numpy.in1d:

import pandas as pd 
import numpy as np 

a = pd.Series([1, 1, 1, 1, 2, 2]) 

#for testing len(a) = 6000 
a = pd.concat([a]*1000).reset_index(drop=True) 

print np.in1d(a,1).sum() 
4000 
print (a == 1).sum() 
4000 
print np.sum(a==1) 
4000 

Timings:

len(a)=6:

In [131]: %timeit np.in1d(a,1).sum() 
The slowest run took 9.17 times longer than the fastest. This could mean that an intermediate result is being cached 
10000 loops, best of 3: 29.9 µs per loop 

In [132]: %timeit np.sum(a == 1) 
10000 loops, best of 3: 196 µs per loop 

In [133]: %timeit (a == 1).sum() 
1000 loops, best of 3: 180 µs per loop 

len(a)=6000:

In [135]: %timeit np.in1d(a,1).sum() 
The slowest run took 7.29 times longer than the fastest. This could mean that an intermediate result is being cached 
10000 loops, best of 3: 48.5 µs per loop 

In [136]: %timeit np.sum(a == 1) 
The slowest run took 5.23 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 273 µs per loop 

In [137]: %timeit (a == 1).sum() 
1000 loops, best of 3: 271 µs per loop 
+0

Przepraszamy, wystąpił błąd. Zmodyfikowaliśmy go. Teraz to zobacz. – Randhawa

+0

Jeśli potrzebujesz zliczyć pojedynczy element, 'np.in1d' jest szybszy jako akceptujący rozwiązanie. Zobacz edit2 i timing. Dziękuję Ci. – jezrael

2

Zażycie powrót value_counts, można wyszukać go dla wielu wartości:

import pandas as pd 

a = pd.Series([1, 1, 1, 1, 2, 2]) 
counts = a.value_counts() 
>>> counts[1], counts[2] 
(4, 2) 

jednak liczyć tylko jeden element, to byłoby szybsze użycie

import numpy as np 
np.sum(a == 1) 
Powiązane problemy