2016-03-17 26 views
5

Mit Pandas, würde ich gerne einen bestimmten Wert in einer Spalte zählen. Ich weiß mit df.somecolumn.ravel() wird mir all das einzigartig Werte und ihre Anzahl. Aber wie man einen bestimmten Wert zählt.Pandas, Zählen eines einzelnen Wertes in einer Spalte eines Datenrahmens

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

Wunsch:

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

Sind Sie optimi Zing dies für mehrere Abfragen oder für eine kleine (oder einzelne) Abfrage? –

+0

Einzelne kleine Abfrage. – Randhawa

+0

siehe Antwort, dann. –

Antwort

9

Sie können versuchen, 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 

Oder:

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

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

Oder:

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

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

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

EDIT2:

Wenn Sie etwas wirklich schnell benötigen, verwenden 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

Sorry, es war ein Fehler in Frage.I haben es bearbeitet.Jetzt sehen Sie es. – Randhawa

+0

Wenn Sie einzelne Elemente zählen müssen, ist 'np.in1d' schneller als akzeptierende Lösung. Bitte beachten Sie edit2 und Timings. Vielen Dank. – jezrael

2

Wenn Sie die value_counts Rückkehr nehmen, können Sie es für mehrere Werte abfragen:

import pandas as pd 

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

jedoch nur ein einzelnes Element zu zählen, wäre es schneller zu verwenden

import numpy as np 
np.sum(a == 1) 
Verwandte Themen