2013-03-16 4 views
2

У меня есть кадр данных pandas с тысячами строк и 4 столбцами. то есть:Подсчет числа строк с pandas в python

A B C D 
1 1 2 0 
3 3 2 1 
3 1 1 0 
.... 

Есть ли способ подсчитать, сколько раз возникает определенная строка? Например, сколько раз можно найти [3,1,1,0] и вернуть индексы этих строк?

+0

Есть много способов сделать это, в том числе наиболее очевидно тривиальный линейный поиск - настолько тривиальным я подозреваю, что никто не просил бы здесь. Я подозреваю, что это не совсем то, что вы ищете? Это больше о поиске дубликатов в общем случае? – marko

ответ

4

Если вы ищете только для одной строки, то я мог бы сделать что-то вроде

>>> df.index[(df == [3, 1, 1, 0]).all(axis=1)] 
Int64Index([2, 3], dtype=int64) 

-

Объяснение следует. Начиная от:

>>> df 
    A B C D 
0 1 1 2 0 
1 3 3 2 1 
2 3 1 1 0 
3 3 1 1 0 
4 3 3 2 1 
5 1 2 3 4 

Мы сравниваем против нашей цели:

>>> df == [3,1,1,0] 
     A  B  C  D 
0 False True False True 
1 True False False False 
2 True True True True 
3 True True True True 
4 True False False False 
5 False False False False 

Найти те, которые матч:

>>> (df == [3,1,1,0]).all(axis=1) 
0 False 
1 False 
2  True 
3  True 
4 False 
5 False 

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

>>> df.index[(df == [3,1,1,0]).all(axis=1)] 
Int64Index([2, 3], dtype=int64) 

Если вы не считая вхождения одной строки, но вместо этого вы хотите сделать это несколько раз для каждой строки, и поэтому вы действительно хотите, чтобы одновременно находить все строки, есть гораздо более быстрые способы, чем повторять это снова и снова. Но это должно работать достаточно хорошо для одной строки.

+0

Спасибо за ваш ответ DSM. Я пробовал и выглядит так, как мне нужно. Однако мой исходный фрейм данных имеет 10 миллионов строк, а результаты df.index, похоже, показывают только совпадения в первых 100 000 строк. Могу ли я что-нибудь сделать, чтобы он прошел весь набор данных? – MA81

+0

Жаль, что теперь это сработало! Совершенно, это то, что мне нужно. большое спасибо! – MA81

1

Сначала создайте образец массива:

>>> import numpy as np 
>>> x = [[1, 1, 2, 0], 
... [3, 3, 2, 1], 
... [3, 1, 1, 0], 
... [0, 1, 2, 3], 
... [3, 1, 1, 0]] 

Затем создать вид массива, где каждая строка представляет собой один элемент:

>>> y = x.view([('', x.dtype)] * x.shape[1]) 
>>> y 
array([[(1, 1, 2, 0)], 
     [(3, 3, 2, 1)], 
     [(3, 1, 1, 0)], 
     [(0, 1, 2, 3)], 
     [(3, 1, 1, 0)]], 
     dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8')]) 

Проделайте то же самое с элементом, который необходимо найти :

>>> e = np.array([[3, 1, 1, 0]]) 
>>> tofind = e.view([('', e.dtype)] * e.shape[1]) 

И теперь вы можете искать элемент:

>>> y == tofind[0] 
array([[False], 
     [False], 
     [ True], 
     [False], 
     [ True]], dtype=bool) 
1

Вы также можете использовать мультииндексный, когда он сортируется, это быстрее, чтобы найти количество:

s = StringIO("""A B C D 
1 1 2 0 
3 3 2 1 
3 1 1 0 
3 1 1 0 
3 3 2 1 
1 2 3 4""") 
df = pd.read_table(s,delim_whitespace=True) 
s = pd.Series(range(len(df)), index=pd.MultiIndex.from_arrays(df.values.T)) 
s = s.sort_index() 
idx = s[3,1,1,0] 
print idx.count(), idx.values 

выход:

2 [2 3] 
Смежные вопросы