2016-03-17 2 views
5

Использование pandas, я хотел бы получить счетчик определенного значения в столбце. Я знаю, используя df.somecolumn.ravel() даст мне все уникальные значения и их счет. Но как получить подсчет определенного значения.Pandas, Получить подсчет одного значения в столбце Dataframe

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

Желаемая:

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

Вы оптимист zing для нескольких запросов или для небольшого (или одного) запроса? –

+0

Один маленький запрос. – Randhawa

+0

смотрите ответ, затем. –

ответ

9

Вы можете попробовать 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 

Или:

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

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

Или:

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

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

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

EDIT2:

Если вам нужно что-то очень быстро, используйте 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

Извините, что в вопросе была ошибка. Я ее отредактировал. Теперь смотрите. – Randhawa

+0

Если вам нужно подсчитать один элемент, 'np.in1d' быстрее, чем принимающее решение. См. Edit2 и тайминги. Спасибо. – jezrael

2

Если взять value_counts возврата, вы можете запросить его для нескольких значений:

import pandas as pd 

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

Однако рассчитывать только один элемент, он будет быстрее использовать

import numpy as np 
np.sum(a == 1) 
Смежные вопросы